This R Markdown Notebook reproduces the analysis of TE001 at the gene expression level. The first section of the Tutorial makes use of the default parameters of the Seurat pipeline. The second part of the tutorial finds a close-to-optimal clustering solution obtained with the Louvain algorithm, by returning the solution with the highest silhouette by optimizing over two parameters, the number of nearest neighbors (NN) and the resolution (res).

1. Setup directories and user-defined parameters

Clean the environment.

rm(list = ls()) 

Set paths to the folders containing data, metadata, output figures and saving directory (to save)

DataFolder <- "/Volumes/ac_lab_scratch/lz2841/ics-rebuttal/TE001/filtered_feature_bc_matrix/"
metadata_path <- "/Volumes/ac_lab_scratch/lz2841/ics-rebuttal/TE001-h5ad/"
savingsFolder <- DataFolder
figures_path = "/Volumes/ac_lab_scratch/lz2841/ics-rebuttal/figures/TE001_gExpr_clustering/"

Decide whether to optimize the clustering solution (later on, in this markdown document) or whether to use previously optimized clustering parameters.

running_clustering <- FALSE # do not re-run clustering
cat("'runnig_clustering' is set to: ", running_clustering,"\n")
'runnig_clustering' is set to:  FALSE 

Define previously determined clustering parameters (not used if running_clustering is set to FALSE). These parameters were obtained with a iterative subclustering routine, as the one shown in the following sections using the acdc package available at: https://github.com/califano-lab/acdc. While the reproducibility of the obtain solution was tested, future updates of the package or different laptop configuration might result in different solutions. If this is the case, we recommend: (1) loading the Seurat object generated with this tutorial or (2) re-running the clustering optimization from the scratch, by setting running_clustering = TRUE. For enhanced performance, acdc comes also with a Grid Search-based optimization that allows for multi-thread, thus speeding up the computation.

# optimal clustering parameters - previously determined
# step 1
opt_param <- c(0.03013859, 22) # res NN 

# step 2 (subclustering)
optim_par_list <- matrix(c(0.05655232, 7, 0.0876204, 8, 0.06659604, 7),byrow=TRUE,nrow=3,ncol=2)
colnames(optim_par_list) <- c("res", "NN")
rownames(optim_par_list) <- c("1", "3", "2")

Load libraries.

library(dplyr)
library(matrixStats)
library(Seurat)
library(tibble)
library(acdc)
library(cluster)
library(ggplot2)
library(factoextra)
library(ComplexHeatmap)
library(RColorBrewer)
library(circlize)
library(gridExtra)

2. Load data, perform quality control and cell filtering

Define thresholds for cell filtering.

min_cells <- 5
min_feats <- 1000
  
min_nFeature_RNA <- 1500
max_nFeature_RNA <- 20000
max_nCount_RNA <- 100000
mt_percent_threshold <- 10

Load UMI counts and create Seurat Object.

# counts
TE001_data <- Read10X(file.path(data.dir=file.path(DataFolder))) # load counts

# generate Seurat object  
TE001 <- CreateSeuratObject(counts=TE001_data,
                            project="TE001",
                            assay="RNA",
                            min.cells = min_cells,
                            min.features = min_feats)
  
TE001@meta.data$cell_id <- rownames(TE001@meta.data) 
TE001@meta.data <- TE001@meta.data %>% dplyr::select(.,cell_id, everything())

Visualize QC as violin plots before filtering.

TE001[["percent.mt"]] <- PercentageFeatureSet(TE001, pattern="^mt")
  
VlnPlot(TE001, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3, pt.size=0)

Filter out low quality cells and visualize QC plots after filtering.

# Filter out cells
TE001 <- subset(TE001, subset = nFeature_RNA > min_nFeature_RNA & nFeature_RNA < max_nFeature_RNA & nCount_RNA < max_nCount_RNA & percent.mt < mt_percent_threshold)
  
# Visualize QC metrics as a violin plot AFTER filtering
VlnPlot(TE001, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3, pt.size=0)

  
# FeatureScatter is typically used to visualize feature-feature relationships
plot1 <- FeatureScatter(TE001, feature1 = "nCount_RNA", feature2 = "percent.mt", col="darkgray")
plot2 <- FeatureScatter(TE001, feature1 = "nCount_RNA", feature2 = "nFeature_RNA", col="darkgray")

grid.arrange(plot1, plot2, ncol = 2)

Load additional metadata and include in Seurat object.

# load additional metadata for the cells
metadata_csv <- file.path(metadata_path, "TE001-metadata-umap-and-clusters-for-paper.csv")
metadata <- read.csv(metadata_csv)

# join metadata to Seurat object
TE001@meta.data <- TE001@meta.data %>% dplyr::left_join(., metadata, 
                                                        by = c("cell_id" = "cell_id"))
rownames(TE001@meta.data) <- TE001@meta.data$cell_id

3. Analysis of TE001 with standard Seurat workflow and clustering with default parameters

Log-Normalize data, find and display highly variable genes and scale data.

# Normalize Data
TE001 <- NormalizeData(TE001, normalization.method = "LogNormalize", scale.factor = 10000)
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
  
# Finding Variable features
TE001 <- FindVariableFeatures(TE001, selection.method = "vst", nfeatures = 2000)
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
top10_hvg <- head(VariableFeatures(TE001), 10)
plot1 <- VariableFeaturePlot(TE001)
plot2 <- LabelPoints(plot = plot1, points = top10_hvg, repel = TRUE, xnudge=0, ynudge=0)
plot2
dev.off()
null device 
          1 
  
# Scaling the data
all.genes <- rownames(TE001)
TE001 <- ScaleData(TE001, features = all.genes)
Centering and scaling data matrix

  |                                                                                                                                                    
  |                                                                                                                                              |   0%
  |                                                                                                                                                    
  |=========                                                                                                                                     |   6%
  |                                                                                                                                                    
  |==================                                                                                                                            |  12%
  |                                                                                                                                                    
  |===========================                                                                                                                   |  19%
  |                                                                                                                                                    
  |====================================                                                                                                          |  25%
  |                                                                                                                                                    
  |============================================                                                                                                  |  31%
  |                                                                                                                                                    
  |=====================================================                                                                                         |  38%
  |                                                                                                                                                    
  |==============================================================                                                                                |  44%
  |                                                                                                                                                    
  |=======================================================================                                                                       |  50%
  |                                                                                                                                                    
  |================================================================================                                                              |  56%
  |                                                                                                                                                    
  |=========================================================================================                                                     |  62%
  |                                                                                                                                                    
  |==================================================================================================                                            |  69%
  |                                                                                                                                                    
  |==========================================================================================================                                    |  75%
  |                                                                                                                                                    
  |===================================================================================================================                           |  81%
  |                                                                                                                                                    
  |============================================================================================================================                  |  88%
  |                                                                                                                                                    
  |=====================================================================================================================================         |  94%
  |                                                                                                                                                    
  |==============================================================================================================================================| 100%

Cluster cells with Louvain algorithm. 0.5 is used as the resolution value, as in https://satijalab.org/seurat/articles/pbmc3k_tutorial.

# Perform linear dimensionality reduction
TE001 <- RunPCA(TE001, verbose=F)

# Cluster the cells with default parameters
TE001 <- FindNeighbors(TE001, k.param = 20)
Computing nearest neighbor graph
Computing SNN
TE001 <- FindClusters(TE001, resolution = 0.5) #
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 3656
Number of edges: 103035

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8939
Number of communities: 12
Elapsed time: 0 seconds
  
levels(TE001@meta.data$seurat_clusters) <- as.character(as.numeric(levels(TE001@meta.data$seurat_clusters)) + 1)

Evaluate the quality of clustering solution by visualizing the Silhouette Score.

# evaluate clustering solution
PCs<-as.data.frame(TE001$pca@cell.embeddings[,1:10])
euc_distance<-dist(PCs, method="euclidean")
  
s <- silhouette( as.integer(TE001$seurat_clusters) , euc_distance )
pdf(file.path(figures_path, "silhouette_default.pdf") , width = 6 , height = 8)
fviz_silhouette(s,print.summary = FALSE)    
dev.off()
null device 
          1 
fviz_silhouette(s,print.summary = FALSE)    

Visualize clusters at gene expression on a UMAP embedding.

TE001 <- RunUMAP(TE001, dims = 1:10)
10:15:43 UMAP embedding parameters a = 0.9922 b = 1.112
10:15:43 Read 3656 rows and found 10 numeric columns
10:15:43 Using Annoy for neighbor search, n_neighbors = 30
10:15:43 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
10:15:43 Writing NN index file to temp file /var/folders/_d/34rjbm053_n2jgnf4njw2l7h0000gn/T//Rtmp99Ud1h/file1b56732c8ea8
10:15:43 Searching Annoy index using 1 thread, search_k = 3000
10:15:44 Annoy recall = 100%
10:15:44 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
10:15:45 Initializing from normalized Laplacian + noise (using irlba)
10:15:45 Commencing optimization for 500 epochs, with 135708 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
10:15:48 Optimization finished
  
pdf(file.path(figures_path, "umap_clusters_default.pdf") ,width = 12, height = 6)
DimPlot(TE001, reduction = "umap", pt.size=1.5, group.by = c("seurat_clusters","iter_cluster_id_with_paneth"))
  dev.off()
null device 
          1 
  
pdf(file.path(figures_path, "umap_default_cytotrace.pdf") , width = 6 , height = 6)
FeaturePlot(TE001, features = "cytotrace_te001", pt.size=1.5) & scale_color_viridis_c()
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.
dev.off()
null device 
          1 
# Show figures in cell
DimPlot(TE001, reduction = "umap", pt.size=1.5, group.by = "seurat_clusters")


DimPlot(TE001, reduction = "umap", pt.size=1.5, group.by = "iter_cluster_id_with_paneth")


FeaturePlot(TE001, features = "cytotrace_te001", pt.size=1.5) & scale_color_viridis_c()
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.

Perform differential gene expression analysis on the identified clusters with default Seurat pipeline

Idents(TE001) <- "seurat_clusters"
    
# FindAllMarkers with default parameters
TE001_markers <- FindAllMarkers(TE001, 
                        assay = "RNA",
                        slot="data",
                        test.use = "wilcox", 
                        only.pos = TRUE)
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02s          
  |++                                                | 2 % ~02s          
  |++                                                | 3 % ~02s          
  |+++                                               | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 6 % ~02s          
  |++++                                              | 7 % ~02s          
  |+++++                                             | 8 % ~02s          
  |+++++                                             | 9 % ~02s          
  |++++++                                            | 10% ~02s          
  |++++++                                            | 11% ~01s          
  |+++++++                                           | 12% ~01s          
  |+++++++                                           | 13% ~01s          
  |++++++++                                          | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |+++++++++                                         | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |++++++++++                                        | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |+++++++++++                                       | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |+++++++++++++                                     | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |++++++++++++++                                    | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |+++++++++++++++                                   | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |++++++++++++++++                                  | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |++++++++++++++++++++                              | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |+++++++++++++++++++++                             | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |++++++++++++++++++++++                            | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~01s          
  |++                                                | 3 % ~01s          
  |+++                                               | 5 % ~01s          
  |+++                                               | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |+++++                                             | 8 % ~01s          
  |+++++                                             | 9 % ~01s          
  |++++++                                            | 10% ~01s          
  |++++++                                            | 12% ~01s          
  |+++++++                                           | 13% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |+++++++++                                         | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |++++++++++                                        | 19% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |+++++++++++++                                     | 24% ~01s          
  |+++++++++++++                                     | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |++++++++++++++++                                  | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |+++++++++++++++++                                 | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |++++++++++++++++++++                              | 38% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |++++++++++++++++++++++++++++                      | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 58% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |+++++++++++++++++++++++++++++++                   | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |++++++++++++++++++++++++++++++++++                | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 3 % ~01s          
  |++                                                | 4 % ~01s          
  |+++                                               | 5 % ~01s          
  |++++                                              | 6 % ~01s          
  |++++                                              | 8 % ~01s          
  |+++++                                             | 9 % ~01s          
  |++++++                                            | 10% ~01s          
  |++++++                                            | 12% ~01s          
  |+++++++                                           | 13% ~01s          
  |++++++++                                          | 14% ~01s          
  |++++++++                                          | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |++++++++++                                        | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |+++++++++++++                                     | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |+++++++++++++++++++                               | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |+++++++++++++++++++++                             | 40% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |++++++++++++++++++++++++++++++++++                | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 3 % ~01s          
  |+++                                               | 4 % ~01s          
  |+++                                               | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |+++++                                             | 9 % ~01s          
  |++++++                                            | 10% ~01s          
  |++++++                                            | 12% ~01s          
  |+++++++                                           | 13% ~01s          
  |++++++++                                          | 15% ~01s          
  |+++++++++                                         | 16% ~01s          
  |+++++++++                                         | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |+++++++++++++++                                   | 28% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |+++++++++++++++++++++                             | 40% ~00s          
  |+++++++++++++++++++++                             | 42% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |++++++++++++++++++++++++                          | 46% ~00s          
  |++++++++++++++++++++++++                          | 48% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |+++++++++++++++++++++++++++                       | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 58% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~03s          
  |++                                                | 3 % ~03s          
  |+++                                               | 4 % ~03s          
  |+++                                               | 5 % ~03s          
  |++++                                              | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |+++++                                             | 8 % ~03s          
  |+++++                                             | 9 % ~03s          
  |++++++                                            | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |+++++++                                           | 12% ~03s          
  |+++++++                                           | 13% ~03s          
  |++++++++                                          | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 18% ~03s          
  |++++++++++                                        | 19% ~03s          
  |+++++++++++                                       | 20% ~03s          
  |+++++++++++                                       | 21% ~03s          
  |++++++++++++                                      | 22% ~03s          
  |++++++++++++                                      | 23% ~03s          
  |+++++++++++++                                     | 24% ~02s          
  |+++++++++++++                                     | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |++++++++++++++                                    | 28% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |+++++++++++++++++                                 | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |+++++++++++++++++++++                             | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |+++++++++++++++++++++++                           | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |++++++++++++++++++++++++                          | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |+++++++++++++++++++++++++                         | 50% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |+++++++++++++++++++++++++++                       | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |++++++++++++++++++++++++++++++++++                | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02s          
  |++                                                | 2 % ~02s          
  |++                                                | 3 % ~02s          
  |+++                                               | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 6 % ~02s          
  |++++                                              | 7 % ~02s          
  |+++++                                             | 8 % ~02s          
  |+++++                                             | 9 % ~01s          
  |++++++                                            | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |+++++++                                           | 12% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |++++++++                                          | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |+++++++++                                         | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |+++++++++++                                       | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |++++++++++++                                      | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |++++++++++++++                                    | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |+++++++++++++++                                   | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |++++++++++++++++                                  | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |+++++++++++++++++++                               | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~03s          
  |++                                                | 3 % ~03s          
  |+++                                               | 4 % ~03s          
  |+++                                               | 6 % ~03s          
  |++++                                              | 7 % ~03s          
  |++++                                              | 8 % ~03s          
  |+++++                                             | 9 % ~02s          
  |++++++                                            | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 12% ~02s          
  |+++++++                                           | 13% ~02s          
  |++++++++                                          | 15% ~02s          
  |++++++++                                          | 16% ~02s          
  |+++++++++                                         | 17% ~02s          
  |+++++++++                                         | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |+++++++++++                                       | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |++++++++++++                                      | 22% ~02s          
  |++++++++++++                                      | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |+++++++++++++                                     | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |+++++++++++++++                                   | 28% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |++++++++++++++++                                  | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |+++++++++++++++++                                 | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |++++++++++++++++++++                              | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |+++++++++++++++++++++                             | 40% ~02s          
  |+++++++++++++++++++++                             | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |++++++++++++++++++++++                            | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |++++++++++++++++++++++++++++++++++                | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~06s          
  |++                                                | 2 % ~05s          
  |++                                                | 3 % ~05s          
  |+++                                               | 4 % ~05s          
  |+++                                               | 5 % ~05s          
  |++++                                              | 6 % ~05s          
  |++++                                              | 7 % ~05s          
  |+++++                                             | 8 % ~05s          
  |+++++                                             | 9 % ~05s          
  |++++++                                            | 10% ~05s          
  |++++++                                            | 11% ~05s          
  |+++++++                                           | 12% ~05s          
  |+++++++                                           | 14% ~05s          
  |++++++++                                          | 15% ~05s          
  |++++++++                                          | 16% ~05s          
  |+++++++++                                         | 17% ~05s          
  |+++++++++                                         | 18% ~04s          
  |++++++++++                                        | 19% ~04s          
  |++++++++++                                        | 20% ~04s          
  |+++++++++++                                       | 21% ~04s          
  |+++++++++++                                       | 22% ~04s          
  |++++++++++++                                      | 23% ~04s          
  |++++++++++++                                      | 24% ~04s          
  |+++++++++++++                                     | 25% ~04s          
  |++++++++++++++                                    | 26% ~04s          
  |++++++++++++++                                    | 27% ~04s          
  |+++++++++++++++                                   | 28% ~04s          
  |+++++++++++++++                                   | 29% ~04s          
  |++++++++++++++++                                  | 30% ~04s          
  |++++++++++++++++                                  | 31% ~04s          
  |+++++++++++++++++                                 | 32% ~04s          
  |+++++++++++++++++                                 | 33% ~04s          
  |++++++++++++++++++                                | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |+++++++++++++++++++                               | 36% ~03s          
  |+++++++++++++++++++                               | 38% ~03s          
  |++++++++++++++++++++                              | 39% ~03s          
  |++++++++++++++++++++                              | 40% ~03s          
  |+++++++++++++++++++++                             | 41% ~03s          
  |+++++++++++++++++++++                             | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |++++++++++++++++++++++                            | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |+++++++++++++++++++++++                           | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |++++++++++++++++++++++++                          | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |+++++++++++++++++++++++++++                       | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |++++++++++++++++++++++++++++                      | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05s  
Calculating cluster 9

  |                                                  | 0 % ~calculating  
  |++                                                | 2 % ~00s          
  |+++                                               | 5 % ~00s          
  |++++                                              | 7 % ~00s          
  |+++++                                             | 10% ~00s          
  |++++++                                            | 12% ~00s          
  |++++++++                                          | 14% ~00s          
  |+++++++++                                         | 17% ~00s          
  |++++++++++                                        | 19% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |++++++++++++                                      | 24% ~00s          
  |++++++++++++++                                    | 26% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |++++++++++++++++++                                | 36% ~00s          
  |++++++++++++++++++++                              | 38% ~00s          
  |+++++++++++++++++++++                             | 40% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |++++++++++++++++++++++++                          | 48% ~00s          
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |+++++++++++++++++++++++++++                       | 52% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 62% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Calculating cluster 10

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~08s          
  |++                                                | 2 % ~07s          
  |++                                                | 3 % ~07s          
  |+++                                               | 4 % ~07s          
  |+++                                               | 5 % ~07s          
  |++++                                              | 6 % ~07s          
  |++++                                              | 7 % ~07s          
  |+++++                                             | 9 % ~07s          
  |+++++                                             | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |++++++                                            | 12% ~07s          
  |+++++++                                           | 13% ~07s          
  |+++++++                                           | 14% ~07s          
  |++++++++                                          | 15% ~06s          
  |++++++++                                          | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |++++++++++                                        | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |+++++++++++                                       | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |++++++++++++                                      | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |+++++++++++++                                     | 24% ~06s          
  |+++++++++++++                                     | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |++++++++++++++                                    | 28% ~06s          
  |+++++++++++++++                                   | 29% ~05s          
  |+++++++++++++++                                   | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |++++++++++++++++++++                              | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |+++++++++++++++++++++                             | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |++++++++++++++++++++++                            | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |+++++++++++++++++++++++                           | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |++++++++++++++++++++++++                          | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |+++++++++++++++++++++++++++                       | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |++++++++++++++++++++++++++++                      | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |+++++++++++++++++++++++++++++                     | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
Calculating cluster 11

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~20s          
  |++                                                | 2 % ~20s          
  |++                                                | 3 % ~19s          
  |+++                                               | 4 % ~19s          
  |+++                                               | 5 % ~19s          
  |++++                                              | 6 % ~19s          
  |++++                                              | 7 % ~19s          
  |+++++                                             | 8 % ~19s          
  |+++++                                             | 9 % ~18s          
  |++++++                                            | 10% ~18s          
  |++++++                                            | 11% ~18s          
  |+++++++                                           | 12% ~18s          
  |+++++++                                           | 13% ~18s          
  |++++++++                                          | 14% ~17s          
  |++++++++                                          | 15% ~17s          
  |+++++++++                                         | 16% ~17s          
  |+++++++++                                         | 18% ~17s          
  |++++++++++                                        | 19% ~16s          
  |++++++++++                                        | 20% ~16s          
  |+++++++++++                                       | 21% ~16s          
  |+++++++++++                                       | 22% ~16s          
  |++++++++++++                                      | 23% ~16s          
  |++++++++++++                                      | 24% ~15s          
  |+++++++++++++                                     | 25% ~15s          
  |+++++++++++++                                     | 26% ~15s          
  |++++++++++++++                                    | 27% ~15s          
  |++++++++++++++                                    | 28% ~15s          
  |+++++++++++++++                                   | 29% ~14s          
  |+++++++++++++++                                   | 30% ~14s          
  |++++++++++++++++                                  | 31% ~14s          
  |++++++++++++++++                                  | 32% ~14s          
  |+++++++++++++++++                                 | 33% ~14s          
  |++++++++++++++++++                                | 34% ~13s          
  |++++++++++++++++++                                | 35% ~13s          
  |+++++++++++++++++++                               | 36% ~13s          
  |+++++++++++++++++++                               | 37% ~13s          
  |++++++++++++++++++++                              | 38% ~13s          
  |++++++++++++++++++++                              | 39% ~12s          
  |+++++++++++++++++++++                             | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~12s          
  |++++++++++++++++++++++                            | 42% ~12s          
  |++++++++++++++++++++++                            | 43% ~12s          
  |+++++++++++++++++++++++                           | 44% ~11s          
  |+++++++++++++++++++++++                           | 45% ~11s          
  |++++++++++++++++++++++++                          | 46% ~11s          
  |++++++++++++++++++++++++                          | 47% ~11s          
  |+++++++++++++++++++++++++                         | 48% ~11s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |++++++++++++++++++++++++++                        | 52% ~10s          
  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |+++++++++++++++++++++++++++                       | 54% ~09s          
  |++++++++++++++++++++++++++++                      | 55% ~09s          
  |++++++++++++++++++++++++++++                      | 56% ~09s          
  |+++++++++++++++++++++++++++++                     | 57% ~09s          
  |+++++++++++++++++++++++++++++                     | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |++++++++++++++++++++++++++++++                    | 60% ~08s          
  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
  |+++++++++++++++++++++++++++++++                   | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 63% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=20s  
Calculating cluster 12

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~10s          
  |+                                                 | 2 % ~10s          
  |++                                                | 3 % ~09s          
  |++                                                | 4 % ~09s          
  |+++                                               | 5 % ~09s          
  |+++                                               | 6 % ~09s          
  |++++                                              | 7 % ~09s          
  |++++                                              | 8 % ~09s          
  |+++++                                             | 9 % ~09s          
  |+++++                                             | 10% ~08s          
  |++++++                                            | 11% ~08s          
  |++++++                                            | 12% ~08s          
  |+++++++                                           | 13% ~08s          
  |+++++++                                           | 14% ~08s          
  |++++++++                                          | 15% ~08s          
  |++++++++                                          | 16% ~08s          
  |+++++++++                                         | 17% ~08s          
  |+++++++++                                         | 18% ~08s          
  |++++++++++                                        | 19% ~08s          
  |++++++++++                                        | 20% ~08s          
  |+++++++++++                                       | 21% ~07s          
  |+++++++++++                                       | 22% ~07s          
  |++++++++++++                                      | 23% ~07s          
  |++++++++++++                                      | 24% ~07s          
  |+++++++++++++                                     | 25% ~07s          
  |+++++++++++++                                     | 26% ~07s          
  |++++++++++++++                                    | 27% ~07s          
  |++++++++++++++                                    | 28% ~07s          
  |+++++++++++++++                                   | 29% ~07s          
  |+++++++++++++++                                   | 30% ~07s          
  |++++++++++++++++                                  | 31% ~07s          
  |++++++++++++++++                                  | 32% ~07s          
  |+++++++++++++++++                                 | 33% ~06s          
  |+++++++++++++++++                                 | 34% ~06s          
  |++++++++++++++++++                                | 35% ~06s          
  |++++++++++++++++++                                | 36% ~06s          
  |+++++++++++++++++++                               | 37% ~06s          
  |+++++++++++++++++++                               | 38% ~06s          
  |++++++++++++++++++++                              | 39% ~06s          
  |++++++++++++++++++++                              | 40% ~06s          
  |+++++++++++++++++++++                             | 41% ~06s          
  |+++++++++++++++++++++                             | 42% ~06s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |++++++++++++++++++++++                            | 44% ~05s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |+++++++++++++++++++++++                           | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |++++++++++++++++++++++++                          | 48% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |+++++++++++++++++++++++++                         | 50% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |++++++++++++++++++++++++++                        | 52% ~05s          
  |+++++++++++++++++++++++++++                       | 53% ~05s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |+++++++++++++++++++++++++++++                     | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |++++++++++++++++++++++++++++++                    | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |+++++++++++++++++++++++++++++++                   | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~04s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=10s  
    
top10_markers <- TE001_markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_log2FC)
genes_default <- top10_markers$gene

Generate a heatmap showing the top 10 differentially expressed genes on a per-cluster basis

# Visualize clusters and top DE genes on a heatmap
mat_to_show_default <- as.matrix(TE001@assays$RNA@data[genes_default,])
Clusters <- TE001$seurat_clusters
colors <- rainbow(nlevels(Clusters)) 
names(colors) <- levels(Clusters)
  
# prepare df_annot.df 
per.cell.sil.width <- s[,"sil_width"]
names(per.cell.sil.width) <- colnames(TE001)
  
df_annot.df <- TE001@meta.data %>%
  dplyr::select(cluster_id=seurat_clusters, cytotrace_score = cytotrace_te001) %>%
  tibble::rownames_to_column(.,var="cell_id")
df_annot.df$cluster_id <- factor(as.numeric(df_annot.df$cluster_id))
   
x <- as.data.frame(per.cell.sil.width) %>%
  tibble::rownames_to_column(.,var="sample_id") 
  
df_annot.df <- left_join(df_annot.df,x,by=c("cell_id"="sample_id"))
  
sample_ordering_to_print <- rev( order( df_annot.df$per.cell.sil.width ) )
df_annot.df <- df_annot.df[sample_ordering_to_print,]
  
mat_to_show_default <- mat_to_show_default[,match(df_annot.df$cell_id,colnames(mat_to_show_default))]
  
stopifnot(identical( df_annot.df$cell_id, colnames(mat_to_show_default) ))
  
# the silhouette score
sil.fill <- rep(NA, nrow(df_annot.df))
unique_clusters <- unique(df_annot.df$cluster_id)
n_colors <- length(colors)
  
color_index <- 1
for (i in seq_along(unique_clusters)) {
  cluster <- unique_clusters[i]
  sil.fill[df_annot.df$cluster_id == cluster] <- colors[names(colors) == cluster]
  color_index <- i + 1  # Use modulo to cycle through colors
}
  
df_annot_cols_cluster_score <- HeatmapAnnotation( 
  silhouette_score = anno_barplot(
    df_annot.df$per.cell.sil.width,
    bar_width = 1,
    gp = gpar(col = NA, 
              fontsize = 6 ,
              cex = 0.8 ,
              fill =  sil.fill 
    ),
    border = FALSE,
    height = unit(1.25, "cm") ,
    width = unit(0.5, "cm")
  )
)
  
  
# heatmap annotation
df_annot.df <- df_annot.df %>% dplyr::select(cluster_id)
cluster_colors <- colors[ !is.na(names(colors)) ]
df_annot_cols = HeatmapAnnotation( df = df_annot.df,
                                   col = list(cluster_id=cluster_colors)  , 
                                   show_legend = TRUE , na_col = "gray95",
                                   annotation_name_gp = gpar(fontsize=0.1)
                                  )
  
top10_default_hm <- Heatmap( mat_to_show_default,
                     col = circlize::colorRamp2(range(mat_to_show_default)/2, c("darkslateblue", "yellow")),
                     use_raster = FALSE ,
                     column_split = df_annot.df$cluster_id,
                     heatmap_legend_param = list(color_bar = "continuous") ,    
                     cluster_columns = FALSE ,
                     cluster_rows = FALSE ,
                     show_column_names = FALSE ,
                     name = "Gene Expression (log1p)" ,  
                     row_names_gp = gpar(fontsize = 10) , column_names_gp = gpar(fontsize=8),
                     row_title_side = "left" , row_title_gp = gpar(fontsize = 10, fontface="bold")    
                     )
  
  
  
ht_top10_list = df_annot_cols_cluster_score %v% df_annot_cols %v% top10_default_hm
  
pdf(file.path(figures_path,"top_10_default_heatmap.pdf"), width = 15, height = 23)
p <- draw(ht_top10_list, column_km = 1 , 
          heatmap_legend_side = "right", 
          annotation_legend_side = "bottom" )
dev.off()
null device 
          1 
p

Display a dotplot with the top 5 genes per cluster (using the data slot).

top5_markers <- TE001_markers %>% group_by(cluster) %>% top_n(n = 5, wt = avg_log2FC)
  
genes_dp_default <- top5_markers$gene %>% unique()
  
# intialize lists containing dataframes 
Avgs_default <- vector( mode="list", length=length(levels(TE001$seurat_clusters)) )
names(Avgs_default) <- levels(TE001$seurat_clusters)
  
Pct_default <- vector( mode="list", length=length(levels(TE001$seurat_clusters)) )
names(Pct_default) <- levels(TE001$seurat_clusters)
  
for (cluster in levels(TE001$seurat_clusters)){
    
  cells_in_cluster <- TE001$seurat_clusters == cluster
    
  # Avg_default
  Avgs_default[[cluster]] <- TE001[["RNA"]]@data[genes_dp_default, cells_in_cluster] %>%
    rowMeans() %>% 
    as.data.frame() %>% 
    rownames_to_column() %>%
    dplyr::rename(.,"Gene"=rowname,"mean"=.) %>% 
    dplyr::mutate(cluster=cluster)
    
  # Pct
  Pct_default[[cluster]] <- TE001[["RNA"]]@data[genes_dp_default, cells_in_cluster] %>%
    apply(.,1, function(x){ sum(x>0)/length(x)*100 }) %>%
    as.data.frame() %>%
    rownames_to_column() %>%
    dplyr::rename(.,"Gene"=rowname,"Pct"=.) %>%
    dplyr::mutate(cluster=cluster)
    
}
  
# Mean
df_mean.GEx_default <- do.call(rbind, Avgs_default)
rownames(df_mean.GEx_default) <- NULL
# Pct
df_pct.GEx_default <- do.call(rbind, Pct_default)
rownames(df_pct.GEx_default) <- NULL
  
# Summary
summary.GEx_default <- cbind(df_mean.GEx_default[,1:2],df_pct.GEx_default[,2:3]) 
summary.GEx_default$Gene <- factor(summary.GEx_default$Gene, levels=genes_dp_default, ordered = TRUE) 
  
# Printing dotplot for genes
cat("Printing dotplots..\n")
Printing dotplots..
GEx.DGE_DotPlot_default <- ggplot(summary.GEx_default, aes(x=Gene,y=cluster)) +
  geom_point(aes(size = Pct, fill= mean), color="black", shape=21) +
  scale_size("% detected", range = c(0,15), breaks=c(0,25,50,75,100), limits=c(0,100)) +
  scale_fill_gradient2(low="steelblue1", high = "red", mid="white",midpoint=0,
                       limits=range(summary.GEx_default$mean),
                       guide = guide_colorbar(ticks.colour = "black",
                                              frame.colour = "black"),
                       name = "Average Expression\nlog1p(counts)") +
  ylab("Cluster") + xlab("") +
  theme_bw() +
  theme(axis.text.x = element_text(size=10, angle=45, hjust=1, color="black"),
        axis.text.y = element_text(size=12, color="black"),
        axis.title = element_text(size=14) ,
        panel.grid.major = element_blank(), panel.grid.minor = element_blank()
        ) 
  
  
pdf(file.path(figures_path, "GEx-DGE-dotplot_default.pdf") , width = 25 , height = 9)
print(GEx.DGE_DotPlot_default)
dev.off()
null device 
          1 
  
print(GEx.DGE_DotPlot_default)

4. Analysis of TE001 with optimized clustering solution

Scale data with SCTransform and compute PCA.

# new PCA and UMAP will be computed 
TE001@reductions$pca <- NULL
TE001@reductions$umap <- NULL
  
  
TE001 <- SCTransform(object=TE001,
                     assay="RNA",
                     ncells=ncol(TE001),
                     variable.features.n = length(all.genes),
                     do.center = TRUE,
                     do.scale = TRUE,
                     conserve.memory = TRUE)
Calculating cell attributes from input UMI matrix: log_umi
Variance stabilizing transformation of count matrix of size 15224 by 3656
Model formula is y ~ log_umi
Get Negative Binomial regression parameters per gene
Using 2000 genes, 3656 cells

  |                                                                                                                                                    
  |                                                                                                                                              |   0%
  |                                                                                                                                                    
  |====================================                                                                                                          |  25%
  |                                                                                                                                                    
  |=======================================================================                                                                       |  50%
  |                                                                                                                                                    
  |==========================================================================================================                                    |  75%
  |                                                                                                                                                    
  |==============================================================================================================================================| 100%
Found 113 outliers - those will be ignored in fitting/regularization step

Skip calculation of full residual matrix
Will not return corrected UMI because residual type is not set to 'pearson'
Calculating gene attributes
Wall clock passed: Time difference of 13.81408 secs
Setting min_variance to:  -Inf
Calculating variance for residuals of type pearson for 15224 genes

  |                                                                                                                                                    
  |                                                                                                                                              |   0%
  |                                                                                                                                                    
  |==                                                                                                                                            |   2%
  |                                                                                                                                                    
  |=====                                                                                                                                         |   3%
  |                                                                                                                                                    
  |=======                                                                                                                                       |   5%
  |                                                                                                                                                    
  |=========                                                                                                                                     |   7%
  |                                                                                                                                                    
  |============                                                                                                                                  |   8%
  |                                                                                                                                                    
  |==============                                                                                                                                |  10%
  |                                                                                                                                                    
  |=================                                                                                                                             |  12%
  |                                                                                                                                                    
  |===================                                                                                                                           |  13%
  |                                                                                                                                                    
  |=====================                                                                                                                         |  15%
  |                                                                                                                                                    
  |========================                                                                                                                      |  17%
  |                                                                                                                                                    
  |==========================                                                                                                                    |  18%
  |                                                                                                                                                    
  |============================                                                                                                                  |  20%
  |                                                                                                                                                    
  |===============================                                                                                                               |  22%
  |                                                                                                                                                    
  |=================================                                                                                                             |  23%
  |                                                                                                                                                    
  |====================================                                                                                                          |  25%
  |                                                                                                                                                    
  |======================================                                                                                                        |  27%
  |                                                                                                                                                    
  |========================================                                                                                                      |  28%
  |                                                                                                                                                    
  |===========================================                                                                                                   |  30%
  |                                                                                                                                                    
  |=============================================                                                                                                 |  32%
  |                                                                                                                                                    
  |===============================================                                                                                               |  33%
  |                                                                                                                                                    
  |==================================================                                                                                            |  35%
  |                                                                                                                                                    
  |====================================================                                                                                          |  37%
  |                                                                                                                                                    
  |======================================================                                                                                        |  38%
  |                                                                                                                                                    
  |=========================================================                                                                                     |  40%
  |                                                                                                                                                    
  |===========================================================                                                                                   |  42%
  |                                                                                                                                                    
  |==============================================================                                                                                |  43%
  |                                                                                                                                                    
  |================================================================                                                                              |  45%
  |                                                                                                                                                    
  |==================================================================                                                                            |  47%
  |                                                                                                                                                    
  |=====================================================================                                                                         |  48%
  |                                                                                                                                                    
  |=======================================================================                                                                       |  50%
  |                                                                                                                                                    
  |=========================================================================                                                                     |  52%
  |                                                                                                                                                    
  |============================================================================                                                                  |  53%
  |                                                                                                                                                    
  |==============================================================================                                                                |  55%
  |                                                                                                                                                    
  |================================================================================                                                              |  57%
  |                                                                                                                                                    
  |===================================================================================                                                           |  58%
  |                                                                                                                                                    
  |=====================================================================================                                                         |  60%
  |                                                                                                                                                    
  |========================================================================================                                                      |  62%
  |                                                                                                                                                    
  |==========================================================================================                                                    |  63%
  |                                                                                                                                                    
  |============================================================================================                                                  |  65%
  |                                                                                                                                                    
  |===============================================================================================                                               |  67%
  |                                                                                                                                                    
  |=================================================================================================                                             |  68%
  |                                                                                                                                                    
  |===================================================================================================                                           |  70%
  |                                                                                                                                                    
  |======================================================================================================                                        |  72%
  |                                                                                                                                                    
  |========================================================================================================                                      |  73%
  |                                                                                                                                                    
  |==========================================================================================================                                    |  75%
  |                                                                                                                                                    
  |=============================================================================================================                                 |  77%
  |                                                                                                                                                    
  |===============================================================================================================                               |  78%
  |                                                                                                                                                    
  |==================================================================================================================                            |  80%
  |                                                                                                                                                    
  |====================================================================================================================                          |  82%
  |                                                                                                                                                    
  |======================================================================================================================                        |  83%
  |                                                                                                                                                    
  |=========================================================================================================================                     |  85%
  |                                                                                                                                                    
  |===========================================================================================================================                   |  87%
  |                                                                                                                                                    
  |=============================================================================================================================                 |  88%
  |                                                                                                                                                    
  |================================================================================================================================              |  90%
  |                                                                                                                                                    
  |==================================================================================================================================            |  92%
  |                                                                                                                                                    
  |=====================================================================================================================================         |  93%
  |                                                                                                                                                    
  |=======================================================================================================================================       |  95%
  |                                                                                                                                                    
  |=========================================================================================================================================     |  97%
  |                                                                                                                                                    
  |============================================================================================================================================  |  98%
  |                                                                                                                                                    
  |==============================================================================================================================================| 100%
Determine variable features
Setting min_variance to:  -Inf
Calculating residuals of type pearson for 15224 genes

  |                                                                                                                                                    
  |                                                                                                                                              |   0%
  |                                                                                                                                                    
  |==                                                                                                                                            |   2%
  |                                                                                                                                                    
  |=====                                                                                                                                         |   3%
  |                                                                                                                                                    
  |=======                                                                                                                                       |   5%
  |                                                                                                                                                    
  |=========                                                                                                                                     |   7%
  |                                                                                                                                                    
  |============                                                                                                                                  |   8%
  |                                                                                                                                                    
  |==============                                                                                                                                |  10%
  |                                                                                                                                                    
  |=================                                                                                                                             |  12%
  |                                                                                                                                                    
  |===================                                                                                                                           |  13%
  |                                                                                                                                                    
  |=====================                                                                                                                         |  15%
  |                                                                                                                                                    
  |========================                                                                                                                      |  17%
  |                                                                                                                                                    
  |==========================                                                                                                                    |  18%
  |                                                                                                                                                    
  |============================                                                                                                                  |  20%
  |                                                                                                                                                    
  |===============================                                                                                                               |  22%
  |                                                                                                                                                    
  |=================================                                                                                                             |  23%
  |                                                                                                                                                    
  |====================================                                                                                                          |  25%
  |                                                                                                                                                    
  |======================================                                                                                                        |  27%
  |                                                                                                                                                    
  |========================================                                                                                                      |  28%
  |                                                                                                                                                    
  |===========================================                                                                                                   |  30%
  |                                                                                                                                                    
  |=============================================                                                                                                 |  32%
  |                                                                                                                                                    
  |===============================================                                                                                               |  33%
  |                                                                                                                                                    
  |==================================================                                                                                            |  35%
  |                                                                                                                                                    
  |====================================================                                                                                          |  37%
  |                                                                                                                                                    
  |======================================================                                                                                        |  38%
  |                                                                                                                                                    
  |=========================================================                                                                                     |  40%
  |                                                                                                                                                    
  |===========================================================                                                                                   |  42%
  |                                                                                                                                                    
  |==============================================================                                                                                |  43%
  |                                                                                                                                                    
  |================================================================                                                                              |  45%
  |                                                                                                                                                    
  |==================================================================                                                                            |  47%
  |                                                                                                                                                    
  |=====================================================================                                                                         |  48%
  |                                                                                                                                                    
  |=======================================================================                                                                       |  50%
  |                                                                                                                                                    
  |=========================================================================                                                                     |  52%
  |                                                                                                                                                    
  |============================================================================                                                                  |  53%
  |                                                                                                                                                    
  |==============================================================================                                                                |  55%
  |                                                                                                                                                    
  |================================================================================                                                              |  57%
  |                                                                                                                                                    
  |===================================================================================                                                           |  58%
  |                                                                                                                                                    
  |=====================================================================================                                                         |  60%
  |                                                                                                                                                    
  |========================================================================================                                                      |  62%
  |                                                                                                                                                    
  |==========================================================================================                                                    |  63%
  |                                                                                                                                                    
  |============================================================================================                                                  |  65%
  |                                                                                                                                                    
  |===============================================================================================                                               |  67%
  |                                                                                                                                                    
  |=================================================================================================                                             |  68%
  |                                                                                                                                                    
  |===================================================================================================                                           |  70%
  |                                                                                                                                                    
  |======================================================================================================                                        |  72%
  |                                                                                                                                                    
  |========================================================================================================                                      |  73%
  |                                                                                                                                                    
  |==========================================================================================================                                    |  75%
  |                                                                                                                                                    
  |=============================================================================================================                                 |  77%
  |                                                                                                                                                    
  |===============================================================================================================                               |  78%
  |                                                                                                                                                    
  |==================================================================================================================                            |  80%
  |                                                                                                                                                    
  |====================================================================================================================                          |  82%
  |                                                                                                                                                    
  |======================================================================================================================                        |  83%
  |                                                                                                                                                    
  |=========================================================================================================================                     |  85%
  |                                                                                                                                                    
  |===========================================================================================================================                   |  87%
  |                                                                                                                                                    
  |=============================================================================================================================                 |  88%
  |                                                                                                                                                    
  |================================================================================================================================              |  90%
  |                                                                                                                                                    
  |==================================================================================================================================            |  92%
  |                                                                                                                                                    
  |=====================================================================================================================================         |  93%
  |                                                                                                                                                    
  |=======================================================================================================================================       |  95%
  |                                                                                                                                                    
  |=========================================================================================================================================     |  97%
  |                                                                                                                                                    
  |============================================================================================================================================  |  98%
  |                                                                                                                                                    
  |==============================================================================================================================================| 100%
Computing corrected UMI count matrix

  |                                                                                                                                                    
  |                                                                                                                                              |   0%
  |                                                                                                                                                    
  |=====                                                                                                                                         |   3%
  |                                                                                                                                                    
  |=========                                                                                                                                     |   6%
  |                                                                                                                                                    
  |==============                                                                                                                                |  10%
  |                                                                                                                                                    
  |==================                                                                                                                            |  13%
  |                                                                                                                                                    
  |=======================                                                                                                                       |  16%
  |                                                                                                                                                    
  |===========================                                                                                                                   |  19%
  |                                                                                                                                                    
  |================================                                                                                                              |  23%
  |                                                                                                                                                    
  |=====================================                                                                                                         |  26%
  |                                                                                                                                                    
  |=========================================                                                                                                     |  29%
  |                                                                                                                                                    
  |==============================================                                                                                                |  32%
  |                                                                                                                                                    
  |==================================================                                                                                            |  35%
  |                                                                                                                                                    
  |=======================================================                                                                                       |  39%
  |                                                                                                                                                    
  |============================================================                                                                                  |  42%
  |                                                                                                                                                    
  |================================================================                                                                              |  45%
  |                                                                                                                                                    
  |=====================================================================                                                                         |  48%
  |                                                                                                                                                    
  |=========================================================================                                                                     |  52%
  |                                                                                                                                                    
  |==============================================================================                                                                |  55%
  |                                                                                                                                                    
  |==================================================================================                                                            |  58%
  |                                                                                                                                                    
  |=======================================================================================                                                       |  61%
  |                                                                                                                                                    
  |============================================================================================                                                  |  65%
  |                                                                                                                                                    
  |================================================================================================                                              |  68%
  |                                                                                                                                                    
  |=====================================================================================================                                         |  71%
  |                                                                                                                                                    
  |=========================================================================================================                                     |  74%
  |                                                                                                                                                    
  |==============================================================================================================                                |  77%
  |                                                                                                                                                    
  |===================================================================================================================                           |  81%
  |                                                                                                                                                    
  |=======================================================================================================================                       |  84%
  |                                                                                                                                                    
  |============================================================================================================================                  |  87%
  |                                                                                                                                                    
  |================================================================================================================================              |  90%
  |                                                                                                                                                    
  |=====================================================================================================================================         |  94%
  |                                                                                                                                                    
  |=========================================================================================================================================     |  97%
  |                                                                                                                                                    
  |==============================================================================================================================================| 100%
Place corrected count matrix in counts slot
Centering and scaling data matrix

  |                                                                                                                                                    
  |                                                                                                                                              |   0%
  |                                                                                                                                                    
  |=======                                                                                                                                       |   5%
  |                                                                                                                                                    
  |==============                                                                                                                                |  10%
  |                                                                                                                                                    
  |====================                                                                                                                          |  14%
  |                                                                                                                                                    
  |===========================                                                                                                                   |  19%
  |                                                                                                                                                    
  |==================================                                                                                                            |  24%
  |                                                                                                                                                    
  |=========================================                                                                                                     |  29%
  |                                                                                                                                                    
  |===============================================                                                                                               |  33%
  |                                                                                                                                                    
  |======================================================                                                                                        |  38%
  |                                                                                                                                                    
  |=============================================================                                                                                 |  43%
  |                                                                                                                                                    
  |====================================================================                                                                          |  48%
  |                                                                                                                                                    
  |==========================================================================                                                                    |  52%
  |                                                                                                                                                    
  |=================================================================================                                                             |  57%
  |                                                                                                                                                    
  |========================================================================================                                                      |  62%
  |                                                                                                                                                    
  |===============================================================================================                                               |  67%
  |                                                                                                                                                    
  |=====================================================================================================                                         |  71%
  |                                                                                                                                                    
  |============================================================================================================                                  |  76%
  |                                                                                                                                                    
  |===================================================================================================================                           |  81%
  |                                                                                                                                                    
  |==========================================================================================================================                    |  86%
  |                                                                                                                                                    
  |================================================================================================================================              |  90%
  |                                                                                                                                                    
  |=======================================================================================================================================       |  95%
  |                                                                                                                                                    
  |==============================================================================================================================================| 100%
Set default assay to SCT
  
TE001 <- RunPCA(TE001, features=all.genes, verbose=F)

Compute clustering solution at the gene expression level by optimizing the silhouette score with acdc. Bigger clusters (>100 cells) are subclustered in a second step for finer grain cell type assignment.

Clustering (iteration 1):

if (running_clustering == TRUE){
  cat("Computing clustering solution at gene expression..\n")
  control <- list(maxit=1e4,
                  smooth=FALSE,
                  max.time=60*30,
                  temperature=1e9)
    
  TE001 <- SAClustering(S.obj = TE001,
                        assay="SCT",
                        control=control,
                        type.fun = "group.mean.silhouette")
    
  opt_param <- TE001@assays$SCT@misc$SA.history$optim.par # res, NN 
} else if (running_clustering == FALSE){
  cat("Using previously identified optimal solution at gene expression, without recomputing it..\n")
    
  TE001 <- getFinal(S.obj = TE001,
                    assay="SCT",
                    res=opt_param[1],
                    NN=opt_param[2],
                    type.fun="group.mean.silhouette")
    
}
Using previously identified optimal solution at gene expression, without recomputing it..
# rename clusters such that levels start from 1 instead of 0, just for consistency
levels(TE001$seurat_clusters) <- as.character(as.numeric(levels(TE001$seurat_clusters)) + 1)

Display the silhouette after the first clustering iteration.

npcs <- dim( TE001@reductions$pca@cell.embeddings )[2]
  
PCs<-as.data.frame(TE001$pca@cell.embeddings[,1:npcs])
euc_distance<-dist(PCs, method="euclidean")
s <- silhouette( as.integer(TE001$seurat_clusters) , euc_distance )
  
pdf(file.path(figures_path, "step_1_silhouette.pdf") , width = 6 , height = 8)
fviz_silhouette(s,print.summary = FALSE)            
dev.off()
null device 
          1 
fviz_silhouette(s,print.summary = FALSE)            

Show clustering solution after the first iteration on a UMAP embeddings. The first UMAP visualization is the one computed at gene expression level, the second UMAP visualization is the one computed at protein activity.

npcs <- dim( TE001@reductions$pca@cell.embeddings )[2]
  
TE001 <- RunUMAP(TE001, dims = 1:npcs, verbose=F)
  
pdf(file.path(figures_path,"step_1_clustering_umap.pdf"), width = 12, height = 6)  # Adjust width and height as needed
DimPlot(TE001, group.by=c("seurat_clusters", "iter_cluster_id_with_paneth"), reduction="umap", pt.size=1.5)
dev.off()
null device 
          1 
DimPlot(TE001, group.by=c("seurat_clusters", "iter_cluster_id_with_paneth"), reduction="umap", pt.size=1.5)

  
TE001@reductions$umap@cell.embeddings <- as.matrix( TE001@meta.data[c("UMAP_1_scanpy","UMAP_2_scanpy")] )
colnames(TE001@reductions$umap@cell.embeddings) <- c("UMAP_1", "UMAP_2")
  
  
pdf(file.path(figures_path,"step_1_clustering_umap_pa.pdf"), width = 12, height = 6)
DimPlot(TE001, group.by=c("seurat_clusters", "iter_cluster_id_with_paneth"), reduction="umap", pt.size=1.5)
dev.off()
quartz_off_screen 
                2 

  

DimPlot(TE001, group.by=c("seurat_clusters", "iter_cluster_id_with_paneth"), reduction="umap", pt.size=1.5)

Clustering (iteration 2):


# Split by cluster and subcluster
TE001_list <- SplitObject(object=TE001, split.by="seurat_clusters")
  
TE001_clusters <- TE001$seurat_clusters %>% unique()
  
cat("Subclustering only clusters with at least 100 cells..\n")
Subclustering only clusters with at least 100 cells..
n_cells_per_cluster <- sapply(TE001_list, function(x){dim(x)[2]}) 
TE001_clusters_to_subcluster <- TE001_clusters[n_cells_per_cluster >=100]
  
if (running_clustering == TRUE){
  optim_par_list <- matrix(NA, nrow=length(TE001_clusters_to_subcluster), ncol=2)
  colnames(optim_par_list) <- c("res", "NN")
  rownames(optim_par_list) <- as.character(TE001_clusters_to_subcluster)
  
  cat("Subclustering on a cluster by cluster basis..\n")
  for (k in TE001_clusters_to_subcluster){
    
    TE001_list[[k]] <- SAClustering(S.obj = TE001_list[[k]],
                               assay="SCT",
                               control=control,
                               type.fun = "group.mean.silhouette")
    
  # rename clusters such that levels start from 1 instead of 0
  levels(TE001_list[[k]]@meta.data$seurat_clusters) <- as.character(as.numeric(levels(TE001_list[[k]]@meta.data$seurat_clusters)) + 1)
  # store name for branching
  TE001_list[[k]]@meta.data$seurat_clusters <- paste0(k,"_",TE001_list[[k]]@meta.data$seurat_clusters)
    
  optim_par_list[k,] <-  TE001_list[[k]]@assays$SCT@misc$SA.history$optim.par # res, NN 
  }
} else if (running_clustering == FALSE){
  cat("Subclustering on a cluster by cluster basis by using the previously optimized clustering parameters..\n")
    
  for (k in TE001_clusters_to_subcluster){
      
    opt_res <- optim_par_list[k,"res"]
    opt_NN <- optim_par_list[k,"NN"]
    TE001_list[[k]] <- getFinal(S.obj = TE001_list[[k]],
                                    assay="SCT",
                                    res=opt_res,
                                    NN=opt_NN,
                                    type.fun = "group.mean.silhouette")
      
    levels(TE001_list[[k]]@meta.data$seurat_clusters) <- as.character(as.numeric(levels(TE001_list[[k]]@meta.data$seurat_clusters)) + 1)
    TE001_list[[k]]@meta.data$seurat_clusters <- paste0(k,"_",TE001_list[[k]]@meta.data$seurat_clusters)
 }
}
Subclustering on a cluster by cluster basis by using the previously optimized clustering parameters..
  
TE001_list[[k]]@meta.data$seurat_clusters <- as.factor(TE001_list[[k]]@meta.data$seurat_clusters)

# remerge Seurat objects into one Seurat object 
TE001_subclustering <- merge(x=TE001_list[[1]],
                                y=TE001_list[2:length(TE001_list)])

Display the silhouette after the second clustering iteration.

# Re-run PCA to visualize it
TE001_subclustering <- RunPCA(TE001_subclustering, features=all.genes, verbose=F)
  
npcs <- dim( TE001_subclustering@reductions$pca@cell.embeddings )[2]
  
PCs<-as.data.frame(TE001_subclustering$pca@cell.embeddings[,1:npcs])
euc_distance<-dist(PCs, method="euclidean")
  
TE001_subclustering@meta.data$seurat_clusters <- as.factor(TE001_subclustering@meta.data$seurat_clusters)
  
  
s <- silhouette( as.integer(TE001_subclustering$seurat_clusters) , euc_distance )
  
pdf(file.path(figures_path, "step_2_silhouette.pdf") , width = 6 , height = 8)
fviz_silhouette(s,print.summary = FALSE)            
dev.off()
null device 
          1 
  
fviz_silhouette(s,print.summary = FALSE)            

Show clustering solution after the first iteration on a UMAP embeddings. The first UMAP visualization is the one computed at gene expression level, the second UMAP visualization is the one computed at protein activity.

TE001_subclustering <-  RunUMAP(TE001_subclustering, dims = 1:npcs, verbose=F)

pdf(file.path(figures_path,"step_2_clustering_umap.pdf"), width = 12, height = 6) 
DimPlot(TE001_subclustering, group.by=c("seurat_clusters", "iter_cluster_id_with_paneth"), 
          reduction="umap", pt.size=1.5 )
dev.off()
null device 
          1 
  
DimPlot(TE001_subclustering, group.by=c("seurat_clusters", "iter_cluster_id_with_paneth"), 
          reduction="umap", pt.size=1.5 )
  
TE001_subclustering@reductions$umap@cell.embeddings <- as.matrix( TE001_subclustering@meta.data[c("UMAP_1_scanpy","UMAP_2_scanpy")] )
colnames(TE001_subclustering@reductions$umap@cell.embeddings) <- c("UMAP_1", "UMAP_2")
  
pdf(file.path(figures_path,"step_2_clustering_umap_pa.pdf"), width = 12, height = 6)
DimPlot(TE001_subclustering, group.by=c("seurat_clusters", "iter_cluster_id_with_paneth"), 
        reduction="umap", pt.size=1.5 )
dev.off()
quartz_off_screen 
                2 

  
DimPlot(TE001_subclustering, group.by=c("seurat_clusters", "iter_cluster_id_with_paneth"), 
        reduction="umap", pt.size=1.5 )

Display cytotrace score on a UMAP.


pdf(file.path(figures_path,"step_2_clustering_umap_pa_cytotrace.pdf"), width = 6, height = 6)
FeaturePlot(TE001_subclustering, features = "cytotrace_te001", pt.size=1.5) & scale_color_viridis_c()
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.
dev.off()
null device 
          1 
FeaturePlot(TE001_subclustering, features = "cytotrace_te001", pt.size=1.5) & scale_color_viridis_c()
Scale for colour is already present.
Adding another scale for colour, which will replace the existing scale.

Perform differential gene expression analysis on the identified clusters after the solution optimized in 2 steps.

# Perform differential gene expression analysis
cat("Perform differential gene expression analysis on the identified clusters..\n")
Perform differential gene expression analysis on the identified clusters..
Idents(TE001_subclustering) <- "seurat_clusters"
  
# Use RNA slot for calculation of DE genes
TE001_subclustering <- NormalizeData(TE001_subclustering, assay="RNA", normalization.method = "LogNormalize")
Performing log-normalization
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
  
# FindAllMarkers
TE001_subclustering_markers <- FindAllMarkers(TE001_subclustering, 
                                              assay = "RNA",
                                              slot="data",
                                              test.use = "wilcox", 
                                              only.pos = TRUE, 
                                              min.pct = 0.25)
Calculating cluster 1_1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~05s          
  |++                                                | 2 % ~05s          
  |++                                                | 3 % ~05s          
  |+++                                               | 4 % ~05s          
  |+++                                               | 6 % ~05s          
  |++++                                              | 7 % ~05s          
  |++++                                              | 8 % ~05s          
  |+++++                                             | 9 % ~05s          
  |+++++                                             | 10% ~05s          
  |++++++                                            | 11% ~05s          
  |+++++++                                           | 12% ~05s          
  |+++++++                                           | 13% ~05s          
  |++++++++                                          | 14% ~05s          
  |++++++++                                          | 16% ~04s          
  |+++++++++                                         | 17% ~04s          
  |+++++++++                                         | 18% ~04s          
  |++++++++++                                        | 19% ~04s          
  |++++++++++                                        | 20% ~04s          
  |+++++++++++                                       | 21% ~04s          
  |++++++++++++                                      | 22% ~04s          
  |++++++++++++                                      | 23% ~04s          
  |+++++++++++++                                     | 24% ~04s          
  |+++++++++++++                                     | 26% ~04s          
  |++++++++++++++                                    | 27% ~04s          
  |++++++++++++++                                    | 28% ~04s          
  |+++++++++++++++                                   | 29% ~04s          
  |+++++++++++++++                                   | 30% ~04s          
  |++++++++++++++++                                  | 31% ~04s          
  |+++++++++++++++++                                 | 32% ~04s          
  |+++++++++++++++++                                 | 33% ~04s          
  |++++++++++++++++++                                | 34% ~03s          
  |++++++++++++++++++                                | 36% ~03s          
  |+++++++++++++++++++                               | 37% ~03s          
  |+++++++++++++++++++                               | 38% ~03s          
  |++++++++++++++++++++                              | 39% ~03s          
  |++++++++++++++++++++                              | 40% ~03s          
  |+++++++++++++++++++++                             | 41% ~03s          
  |++++++++++++++++++++++                            | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |+++++++++++++++++++++++                           | 44% ~03s          
  |+++++++++++++++++++++++                           | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |++++++++++++++++++++++++                          | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |+++++++++++++++++++++++++++                       | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |+++++++++++++++++++++++++++++                     | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |++++++++++++++++++++++++++++++                    | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05s  
Calculating cluster 1_2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~01s          
  |++                                                | 3 % ~01s          
  |+++                                               | 4 % ~01s          
  |+++                                               | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |++++                                              | 8 % ~01s          
  |+++++                                             | 9 % ~01s          
  |+++++                                             | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |+++++++                                           | 12% ~01s          
  |+++++++                                           | 13% ~01s          
  |++++++++                                          | 14% ~01s          
  |++++++++                                          | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |+++++++++                                         | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |+++++++++++++                                     | 24% ~01s          
  |+++++++++++++                                     | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |+++++++++++++++++++                               | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |++++++++++++++++++++++                            | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 1_3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~11s          
  |++                                                | 2 % ~11s          
  |++                                                | 3 % ~10s          
  |+++                                               | 4 % ~10s          
  |+++                                               | 5 % ~10s          
  |++++                                              | 6 % ~10s          
  |++++                                              | 7 % ~10s          
  |+++++                                             | 8 % ~10s          
  |+++++                                             | 9 % ~10s          
  |++++++                                            | 10% ~10s          
  |++++++                                            | 11% ~09s          
  |+++++++                                           | 12% ~09s          
  |+++++++                                           | 14% ~09s          
  |++++++++                                          | 15% ~09s          
  |++++++++                                          | 16% ~09s          
  |+++++++++                                         | 17% ~09s          
  |+++++++++                                         | 18% ~09s          
  |++++++++++                                        | 19% ~09s          
  |++++++++++                                        | 20% ~09s          
  |+++++++++++                                       | 21% ~08s          
  |+++++++++++                                       | 22% ~08s          
  |++++++++++++                                      | 23% ~08s          
  |++++++++++++                                      | 24% ~08s          
  |+++++++++++++                                     | 25% ~08s          
  |++++++++++++++                                    | 26% ~08s          
  |++++++++++++++                                    | 27% ~08s          
  |+++++++++++++++                                   | 28% ~08s          
  |+++++++++++++++                                   | 29% ~08s          
  |++++++++++++++++                                  | 30% ~07s          
  |++++++++++++++++                                  | 31% ~07s          
  |+++++++++++++++++                                 | 32% ~07s          
  |+++++++++++++++++                                 | 33% ~07s          
  |++++++++++++++++++                                | 34% ~07s          
  |++++++++++++++++++                                | 35% ~07s          
  |+++++++++++++++++++                               | 36% ~07s          
  |+++++++++++++++++++                               | 38% ~07s          
  |++++++++++++++++++++                              | 39% ~07s          
  |++++++++++++++++++++                              | 40% ~06s          
  |+++++++++++++++++++++                             | 41% ~06s          
  |+++++++++++++++++++++                             | 42% ~06s          
  |++++++++++++++++++++++                            | 43% ~06s          
  |++++++++++++++++++++++                            | 44% ~06s          
  |+++++++++++++++++++++++                           | 45% ~06s          
  |+++++++++++++++++++++++                           | 46% ~06s          
  |++++++++++++++++++++++++                          | 47% ~06s          
  |++++++++++++++++++++++++                          | 48% ~06s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |+++++++++++++++++++++++++                         | 50% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |+++++++++++++++++++++++++++                       | 52% ~05s          
  |+++++++++++++++++++++++++++                       | 53% ~05s          
  |++++++++++++++++++++++++++++                      | 54% ~05s          
  |++++++++++++++++++++++++++++                      | 55% ~05s          
  |+++++++++++++++++++++++++++++                     | 56% ~05s          
  |+++++++++++++++++++++++++++++                     | 57% ~05s          
  |++++++++++++++++++++++++++++++                    | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |+++++++++++++++++++++++++++++++                   | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |++++++++++++++++++++++++++++++++                  | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~04s          
  |++++++++++++++++++++++++++++++++++                | 67% ~04s          
  |++++++++++++++++++++++++++++++++++                | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=11s  
Calculating cluster 2_1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~05s          
  |++                                                | 2 % ~05s          
  |++                                                | 3 % ~05s          
  |+++                                               | 4 % ~05s          
  |+++                                               | 5 % ~05s          
  |++++                                              | 6 % ~05s          
  |++++                                              | 7 % ~05s          
  |+++++                                             | 8 % ~05s          
  |+++++                                             | 9 % ~04s          
  |++++++                                            | 10% ~04s          
  |++++++                                            | 11% ~04s          
  |+++++++                                           | 12% ~04s          
  |+++++++                                           | 13% ~04s          
  |++++++++                                          | 14% ~04s          
  |++++++++                                          | 15% ~04s          
  |+++++++++                                         | 16% ~04s          
  |+++++++++                                         | 17% ~04s          
  |++++++++++                                        | 18% ~04s          
  |++++++++++                                        | 19% ~04s          
  |+++++++++++                                       | 20% ~04s          
  |+++++++++++                                       | 21% ~04s          
  |++++++++++++                                      | 22% ~04s          
  |++++++++++++                                      | 23% ~04s          
  |+++++++++++++                                     | 24% ~04s          
  |+++++++++++++                                     | 26% ~04s          
  |++++++++++++++                                    | 27% ~04s          
  |++++++++++++++                                    | 28% ~04s          
  |+++++++++++++++                                   | 29% ~04s          
  |+++++++++++++++                                   | 30% ~03s          
  |++++++++++++++++                                  | 31% ~03s          
  |++++++++++++++++                                  | 32% ~03s          
  |+++++++++++++++++                                 | 33% ~03s          
  |+++++++++++++++++                                 | 34% ~03s          
  |++++++++++++++++++                                | 35% ~03s          
  |++++++++++++++++++                                | 36% ~03s          
  |+++++++++++++++++++                               | 37% ~03s          
  |+++++++++++++++++++                               | 38% ~03s          
  |++++++++++++++++++++                              | 39% ~03s          
  |++++++++++++++++++++                              | 40% ~03s          
  |+++++++++++++++++++++                             | 41% ~03s          
  |+++++++++++++++++++++                             | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |++++++++++++++++++++++                            | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |+++++++++++++++++++++++                           | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |++++++++++++++++++++++++                          | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |+++++++++++++++++++++++++                         | 50% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |+++++++++++++++++++++++++++                       | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~02s          
  |++++++++++++++++++++++++++++                      | 54% ~02s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |+++++++++++++++++++++++++++++                     | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |++++++++++++++++++++++++++++++++++                | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=05s  
Calculating cluster 2_2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~08s          
  |++                                                | 2 % ~08s          
  |++                                                | 3 % ~07s          
  |+++                                               | 4 % ~07s          
  |+++                                               | 5 % ~07s          
  |++++                                              | 6 % ~07s          
  |++++                                              | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |+++++                                             | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |++++++                                            | 12% ~07s          
  |+++++++                                           | 13% ~07s          
  |+++++++                                           | 14% ~07s          
  |++++++++                                          | 15% ~06s          
  |+++++++++                                         | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |++++++++++                                        | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |+++++++++++                                       | 20% ~06s          
  |+++++++++++                                       | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |++++++++++++                                      | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |+++++++++++++                                     | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |++++++++++++++                                    | 28% ~06s          
  |+++++++++++++++                                   | 29% ~05s          
  |++++++++++++++++                                  | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |+++++++++++++++++                                 | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |+++++++++++++++++++                               | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |++++++++++++++++++++                              | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |+++++++++++++++++++++                             | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |+++++++++++++++++++++++++                         | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |++++++++++++++++++++++++++++++                    | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |++++++++++++++++++++++++++++++++                  | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
Calculating cluster 3_1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~03s          
  |++                                                | 3 % ~03s          
  |+++                                               | 4 % ~03s          
  |+++                                               | 5 % ~03s          
  |++++                                              | 6 % ~03s          
  |++++                                              | 8 % ~03s          
  |+++++                                             | 9 % ~03s          
  |+++++                                             | 10% ~03s          
  |++++++                                            | 11% ~03s          
  |++++++                                            | 12% ~03s          
  |+++++++                                           | 13% ~03s          
  |+++++++                                           | 14% ~03s          
  |++++++++                                          | 15% ~03s          
  |+++++++++                                         | 16% ~03s          
  |+++++++++                                         | 17% ~03s          
  |++++++++++                                        | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |+++++++++++                                       | 20% ~02s          
  |+++++++++++                                       | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |++++++++++++                                      | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |+++++++++++++                                     | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |++++++++++++++                                    | 28% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |++++++++++++++++                                  | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |+++++++++++++++++                                 | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |++++++++++++++++++++                              | 40% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |+++++++++++++++++++++                             | 42% ~02s          
  |++++++++++++++++++++++                            | 43% ~02s          
  |+++++++++++++++++++++++                           | 44% ~02s          
  |+++++++++++++++++++++++                           | 45% ~02s          
  |++++++++++++++++++++++++                          | 46% ~02s          
  |++++++++++++++++++++++++                          | 47% ~02s          
  |+++++++++++++++++++++++++                         | 48% ~02s          
  |+++++++++++++++++++++++++                         | 49% ~02s          
  |++++++++++++++++++++++++++                        | 51% ~02s          
  |++++++++++++++++++++++++++                        | 52% ~02s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 3_2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~18s          
  |++                                                | 2 % ~17s          
  |++                                                | 3 % ~17s          
  |+++                                               | 4 % ~17s          
  |+++                                               | 5 % ~17s          
  |++++                                              | 6 % ~17s          
  |++++                                              | 7 % ~17s          
  |+++++                                             | 8 % ~16s          
  |+++++                                             | 9 % ~16s          
  |++++++                                            | 10% ~16s          
  |++++++                                            | 11% ~16s          
  |+++++++                                           | 12% ~16s          
  |+++++++                                           | 13% ~15s          
  |++++++++                                          | 14% ~15s          
  |++++++++                                          | 15% ~15s          
  |+++++++++                                         | 16% ~15s          
  |+++++++++                                         | 17% ~15s          
  |++++++++++                                        | 18% ~15s          
  |++++++++++                                        | 19% ~14s          
  |+++++++++++                                       | 20% ~14s          
  |+++++++++++                                       | 21% ~14s          
  |++++++++++++                                      | 22% ~14s          
  |++++++++++++                                      | 23% ~14s          
  |+++++++++++++                                     | 24% ~13s          
  |+++++++++++++                                     | 26% ~13s          
  |++++++++++++++                                    | 27% ~13s          
  |++++++++++++++                                    | 28% ~13s          
  |+++++++++++++++                                   | 29% ~13s          
  |+++++++++++++++                                   | 30% ~13s          
  |++++++++++++++++                                  | 31% ~12s          
  |++++++++++++++++                                  | 32% ~12s          
  |+++++++++++++++++                                 | 33% ~12s          
  |+++++++++++++++++                                 | 34% ~12s          
  |++++++++++++++++++                                | 35% ~12s          
  |++++++++++++++++++                                | 36% ~12s          
  |+++++++++++++++++++                               | 37% ~11s          
  |+++++++++++++++++++                               | 38% ~11s          
  |++++++++++++++++++++                              | 39% ~11s          
  |++++++++++++++++++++                              | 40% ~11s          
  |+++++++++++++++++++++                             | 41% ~11s          
  |+++++++++++++++++++++                             | 42% ~10s          
  |++++++++++++++++++++++                            | 43% ~10s          
  |++++++++++++++++++++++                            | 44% ~10s          
  |+++++++++++++++++++++++                           | 45% ~10s          
  |+++++++++++++++++++++++                           | 46% ~10s          
  |++++++++++++++++++++++++                          | 47% ~10s          
  |++++++++++++++++++++++++                          | 48% ~09s          
  |+++++++++++++++++++++++++                         | 49% ~09s          
  |+++++++++++++++++++++++++                         | 50% ~09s          
  |++++++++++++++++++++++++++                        | 51% ~09s          
  |+++++++++++++++++++++++++++                       | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~08s          
  |++++++++++++++++++++++++++++                      | 54% ~08s          
  |++++++++++++++++++++++++++++                      | 55% ~08s          
  |+++++++++++++++++++++++++++++                     | 56% ~08s          
  |+++++++++++++++++++++++++++++                     | 57% ~08s          
  |++++++++++++++++++++++++++++++                    | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 59% ~07s          
  |+++++++++++++++++++++++++++++++                   | 60% ~07s          
  |+++++++++++++++++++++++++++++++                   | 61% ~07s          
  |++++++++++++++++++++++++++++++++                  | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 63% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~06s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~06s          
  |++++++++++++++++++++++++++++++++++                | 66% ~06s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=18s  
Calculating cluster 3_3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~00s          
  |++                                                | 3 % ~00s          
  |+++                                               | 4 % ~00s          
  |+++                                               | 6 % ~00s          
  |++++                                              | 7 % ~00s          
  |+++++                                             | 9 % ~00s          
  |++++++                                            | 10% ~00s          
  |++++++                                            | 12% ~00s          
  |+++++++                                           | 13% ~00s          
  |++++++++                                          | 14% ~00s          
  |++++++++                                          | 16% ~00s          
  |+++++++++                                         | 17% ~00s          
  |++++++++++                                        | 19% ~00s          
  |+++++++++++                                       | 20% ~00s          
  |+++++++++++                                       | 22% ~00s          
  |++++++++++++                                      | 23% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |++++++++++++++                                    | 26% ~00s          
  |++++++++++++++                                    | 28% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |++++++++++++++++                                  | 30% ~00s          
  |++++++++++++++++                                  | 32% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |+++++++++++++++++++                               | 36% ~00s          
  |+++++++++++++++++++                               | 38% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |++++++++++++++++++++++                            | 42% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |++++++++++++++++++++++++                          | 46% ~00s          
  |++++++++++++++++++++++++                          | 48% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |+++++++++++++++++++++++++++                       | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |+++++++++++++++++++++++++++++                     | 58% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~10s          
  |+                                                 | 2 % ~10s          
  |++                                                | 3 % ~09s          
  |++                                                | 4 % ~09s          
  |+++                                               | 5 % ~09s          
  |+++                                               | 6 % ~09s          
  |++++                                              | 7 % ~09s          
  |++++                                              | 8 % ~09s          
  |+++++                                             | 9 % ~09s          
  |+++++                                             | 10% ~09s          
  |++++++                                            | 11% ~09s          
  |++++++                                            | 12% ~08s          
  |+++++++                                           | 13% ~08s          
  |+++++++                                           | 14% ~08s          
  |++++++++                                          | 15% ~08s          
  |++++++++                                          | 16% ~08s          
  |+++++++++                                         | 17% ~08s          
  |+++++++++                                         | 18% ~08s          
  |++++++++++                                        | 19% ~08s          
  |++++++++++                                        | 20% ~08s          
  |+++++++++++                                       | 21% ~08s          
  |+++++++++++                                       | 22% ~08s          
  |++++++++++++                                      | 23% ~07s          
  |++++++++++++                                      | 24% ~07s          
  |+++++++++++++                                     | 25% ~07s          
  |+++++++++++++                                     | 26% ~07s          
  |++++++++++++++                                    | 27% ~07s          
  |++++++++++++++                                    | 28% ~07s          
  |+++++++++++++++                                   | 29% ~07s          
  |+++++++++++++++                                   | 30% ~07s          
  |++++++++++++++++                                  | 31% ~07s          
  |++++++++++++++++                                  | 32% ~07s          
  |+++++++++++++++++                                 | 33% ~07s          
  |+++++++++++++++++                                 | 34% ~06s          
  |++++++++++++++++++                                | 35% ~06s          
  |++++++++++++++++++                                | 36% ~06s          
  |+++++++++++++++++++                               | 37% ~06s          
  |+++++++++++++++++++                               | 38% ~06s          
  |++++++++++++++++++++                              | 39% ~06s          
  |++++++++++++++++++++                              | 40% ~06s          
  |+++++++++++++++++++++                             | 41% ~06s          
  |+++++++++++++++++++++                             | 42% ~06s          
  |++++++++++++++++++++++                            | 43% ~06s          
  |++++++++++++++++++++++                            | 44% ~06s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |+++++++++++++++++++++++                           | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |++++++++++++++++++++++++                          | 48% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |+++++++++++++++++++++++++                         | 50% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~05s          
  |++++++++++++++++++++++++++                        | 52% ~05s          
  |+++++++++++++++++++++++++++                       | 53% ~05s          
  |+++++++++++++++++++++++++++                       | 54% ~05s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |+++++++++++++++++++++++++++++                     | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |++++++++++++++++++++++++++++++                    | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |+++++++++++++++++++++++++++++++                   | 62% ~04s          
  |++++++++++++++++++++++++++++++++                  | 63% ~04s          
  |++++++++++++++++++++++++++++++++                  | 64% ~04s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |++++++++++++++++++++++++++++++++++                | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=10s  
  
top10 <- TE001_subclustering_markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_log2FC)

Generate a heatmap showing the top 10 differentially expressed genes on a per-cluster basis

genes <- top10$gene
mat_to_show <- as.matrix(TE001_subclustering@assays$SCT@scale.data[genes,])
  
Clusters <- TE001_subclustering$seurat_clusters
colors <- rainbow(nlevels(Clusters)) 
names(colors) <- levels(Clusters)
  
# prepare df_annot.df 
per.cell.sil.width <- s[,"sil_width"]
names(per.cell.sil.width) <- colnames(TE001_subclustering)
  
df_annot.df <- TE001_subclustering@meta.data %>%
  dplyr::select(cluster_id=seurat_clusters, cytotrace_score = cytotrace_te001) %>%
  tibble::rownames_to_column(.,var="cell_id")
df_annot.df$cluster_id <- factor(as.numeric(df_annot.df$cluster_id))
  
x <- as.data.frame(per.cell.sil.width) %>%
  tibble::rownames_to_column(.,var="sample_id")
   
df_annot.df <- left_join(df_annot.df,x,by=c("cell_id"="sample_id"))
  
df_annot.df <- merge(df_annot.df, TE001_subclustering@meta.data[, c("cell_id", "seurat_clusters")], by = "cell_id", all.x = TRUE) # rename clusters as a tree-like structure
df_annot.df <- df_annot.df[,-2] %>% dplyr::rename(cluster_id=seurat_clusters)

sample_ordering_to_print <- rev( order( df_annot.df$per.cell.sil.width ) )
  
df_annot.df <- df_annot.df[sample_ordering_to_print,]
  
mat_to_show <- mat_to_show[,match(df_annot.df$cell_id,colnames(mat_to_show))]
  
stopifnot(identical( df_annot.df$cell_id, colnames(mat_to_show) ))
  
# the silhouette score
sil.fill <- rep(NA, nrow(df_annot.df))
unique_clusters <- unique(df_annot.df$cluster_id)
n_colors <- length(colors)
  
color_index <- 1
for (i in seq_along(unique_clusters)) {
  cluster <- unique_clusters[i]
  sil.fill[df_annot.df$cluster_id == cluster] <- colors[names(colors) == cluster]
  color_index <- i + 1  # Use modulo to cycle through colors
}
  
df_annot_cols_cluster_score <- HeatmapAnnotation( 
  silhouette_score = anno_barplot(
    df_annot.df$per.cell.sil.width,
    bar_width = 1,
    gp = gpar(col = NA, 
              fontsize = 6 ,
              cex = 0.8 ,
              fill =  sil.fill 
    ),
    border = FALSE,
    height = unit(1.25, "cm") ,
    width = unit(0.5, "cm")
  )
)
  
# heatmap annotation
df_annot.df <- df_annot.df %>% dplyr::select(cluster_id)
cluster_colors <- colors[ !is.na(names(colors)) ]
df_annot_cols = HeatmapAnnotation( df = df_annot.df,
                                   col = list(cluster_id=cluster_colors)  , 
                                   show_legend = TRUE , na_col = "gray95",
                                   annotation_name_gp = gpar(fontsize=0.1)
)
  
top10_hm <- Heatmap( mat_to_show,
                   col = circlize::colorRamp2(range(mat_to_show_default)/2, c("darkslateblue", "yellow")),
                   use_raster = FALSE ,
                   column_split = df_annot.df$cluster_id,
                   heatmap_legend_param = list(color_bar = "continuous") ,  
                   cluster_columns = FALSE ,
                   cluster_rows = FALSE ,
                   show_column_names = FALSE ,
                   name = "Gene Expression (log1p)" ,  
                   row_names_gp = gpar(fontsize = 10) , column_names_gp = gpar(fontsize = 8),
                  row_title_side = "left" , row_title_gp = gpar(fontsize = 10, fontface = "bold")
  )
  
ht_list = df_annot_cols_cluster_score %v% df_annot_cols %v% top10_hm
  
pdf(file.path(figures_path,"top_10_heatmap.pdf"), width = 10, height = 12)
p <- draw(ht_list, column_km = 1 , 
          heatmap_legend_side = "right", 
          annotation_legend_side = "bottom" )
dev.off()  
null device 
          1 
p

Display a dotplot with the top 5 genes per cluster (using the data slot).

# DotPlot
top5 <- TE001_subclustering_markers %>% group_by(cluster) %>% top_n(n = 5, wt = avg_log2FC)
  
genes_dp <- top5$gene %>% unique()
  
# intialize lists containing dataframes 
Avgs <- vector( mode="list", length=length(levels(TE001_subclustering$seurat_clusters)) )
names(Avgs) <- levels(TE001_subclustering$seurat_clusters)
  
Pct <- vector( mode="list", length=length(levels(TE001_subclustering$seurat_clusters)) )
names(Pct) <- levels(TE001_subclustering$seurat_clusters)
  
for (cluster in levels(TE001_subclustering$seurat_clusters)){
  
  cells_in_subcluster <- TE001_subclustering$seurat_clusters == cluster
    
  # Avg 
  Avgs[[cluster]] <- TE001_subclustering[["RNA"]]@data[genes_dp, cells_in_subcluster] %>%
    rowMeans() %>% 
    as.data.frame() %>% 
    rownames_to_column() %>%
    dplyr::rename(.,"Gene"=rowname,"mean"=.) %>% 
    dplyr::mutate(cluster=cluster)
      
  # Pct
  Pct[[cluster]] <- TE001_subclustering[["RNA"]]@data[genes_dp, cells_in_subcluster] %>%
    apply(.,1, function(x){ sum(x>0)/length(x)*100 }) %>%
    as.data.frame() %>%
    rownames_to_column() %>%
    dplyr::rename(.,"Gene"=rowname,"Pct"=.) %>%
    dplyr::mutate(cluster=cluster)
}
  
# Mean
df_mean.GEx <- do.call(rbind, Avgs)
  rownames(df_mean.GEx) <- NULL
# Pct
df_pct.GEx <- do.call(rbind, Pct)
rownames(df_pct.GEx) <- NULL
  
# Summary
summary.GEx <- cbind(df_mean.GEx[,1:2],df_pct.GEx[,2:3]) 
summary.GEx$Gene <- factor(summary.GEx$Gene, levels=genes_dp, ordered = TRUE) 
  
# Printing dotplot for genes
cat("Printing dotplots..\n")
Printing dotplots..
GEx.DGE_DotPlot <- ggplot(summary.GEx, aes(x=Gene,y=cluster)) +
  geom_point(aes(size = Pct, fill= mean), color="black", shape=21) +
  scale_size("% detected", range = c(0,15), breaks=c(0,25,50,75,100), limits=c(0,100)) +
  scale_fill_gradient2(low="steelblue1", high = "red", mid="white",midpoint=0,
                       limits=range(summary.GEx$mean),
                       guide = guide_colorbar(ticks.colour = "black",
                                              frame.colour = "black"),
                       name = "Average Expression\nlog1p(counts)") +
  ylab("Cluster") + xlab("") +
  theme_bw() +
  theme(axis.text.x = element_text(size=10, angle=45, hjust=1, color="black"),
        axis.text.y = element_text(size=12, color="black"),
        axis.title = element_text(size=14) ,
        panel.grid.major = element_blank(), panel.grid.minor = element_blank()
  ) 
  
  
pdf(file.path(figures_path, "GEx-DGE-dotplot.pdf") , width = 22 , height = 9)
print(GEx.DGE_DotPlot)
dev.off()
null device 
          1 
  
print(GEx.DGE_DotPlot)

Save Seurat Object with clustering solution as an .rds file to the DataFolder location.

saveRDS(object=TE001_subclustering, file=file.path(savingsFolder, "TE001_iter_subclustering_gene_expr.rds"))
sessionInfo()
R version 4.3.0 (2023-04-21)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS 14.0

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: America/New_York
tzcode source: internal

attached base packages:
[1] grid      stats4    stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] GenSA_1.1.8             SeuratDisk_0.0.0.9021   pbmc3k.SeuratData_3.1.4 SeuratData_0.2.2        gridExtra_2.3           circlize_0.4.15        
 [7] RColorBrewer_1.1-3      ComplexHeatmap_2.16.0   factoextra_1.0.7        cluster_2.1.6           acdc_0.1.0              tibble_3.2.1           
[13] SeuratObject_4.1.3      Seurat_4.3.0.1          matrixStats_1.0.0       metap_1.8               openxlsx_4.2.5.2        org.Hs.eg.db_3.17.0    
[19] AnnotationDbi_1.62.1    IRanges_2.34.1          S4Vectors_0.38.1        Biobase_2.60.0          BiocGenerics_0.46.0     RobustRankAggreg_1.2.1 
[25] MOMA_1.12.0             ggplot2_3.4.2           dplyr_1.1.2            

loaded via a namespace (and not attached):
  [1] R.methodsS3_1.8.2           goftest_1.2-3               Biostrings_2.68.1           TH.data_1.1-2               vctrs_0.6.3                
  [6] spatstat.random_3.1-5       digest_0.6.31               png_0.1-8                   shape_1.4.6                 ggrepel_0.9.3              
 [11] deldir_1.0-9                parallelly_1.36.0           MASS_7.3-60                 reshape2_1.4.4              httpuv_1.6.11              
 [16] foreach_1.5.2               qvalue_2.32.0               withr_2.5.0                 ggrastr_1.0.2               xfun_0.39                  
 [21] ggpubr_0.6.0                ellipsis_0.3.2              survival_3.5-5              memoise_2.0.1               ggbeeswarm_0.7.2           
 [26] zoo_1.8-12                  GlobalOptions_0.1.2         pbapply_1.7-2               R.oo_1.25.0                 DEoptimR_1.0-14            
 [31] KEGGREST_1.40.0             promises_1.2.0.1            httr_1.4.6                  rstatix_0.7.2               globals_0.16.2             
 [36] fitdistrplus_1.1-11         rstudioapi_0.14             miniUI_0.1.1.1              generics_0.1.3              zlibbioc_1.46.0            
 [41] polyclip_1.10-4             TFisher_0.2.0               GenomeInfoDbData_1.2.10     xtable_1.8-4                stringr_1.5.0              
 [46] doParallel_1.0.17           evaluate_0.21               S4Arrays_1.0.4              MKmisc_1.9                  hms_1.1.3                  
 [51] GenomicRanges_1.52.0        irlba_2.3.5.1               colorspace_2.1-0            hdf5r_1.3.8                 ROCR_1.0-11                
 [56] reticulate_1.30             readxl_1.4.2                spatstat.data_3.0-1         magrittr_2.0.3              lmtest_0.9-40              
 [61] readr_2.1.4                 later_1.3.1                 viridis_0.6.3               lattice_0.21-8              spatstat.geom_3.2-1        
 [66] future.apply_1.11.0         robustbase_0.99-0           scattermore_1.2             cowplot_1.1.1               RcppAnnoy_0.0.21           
 [71] pillar_1.9.0                nlme_3.1-162                iterators_1.0.14            compiler_4.3.0              stringi_1.7.12             
 [76] tensor_1.5                  SummarizedExperiment_1.30.2 plyr_1.8.8                  crayon_1.5.2                abind_1.4-5                
 [81] sn_2.1.1                    sp_2.0-0                    bit_4.0.5                   mathjaxr_1.6-0              sandwich_3.0-2             
 [86] codetools_0.2-19            multcomp_1.4-25             bslib_0.5.0                 GetoptLong_1.0.5            plotly_4.10.2              
 [91] multtest_2.56.0             mime_0.12                   MultiAssayExperiment_1.26.0 splines_4.3.0               Rcpp_1.0.10                
 [96] cellranger_1.1.0            knitr_1.43                  blob_1.2.4                  utf8_1.2.3                  clue_0.3-64                
[101] listenv_0.9.0               Rdpack_2.4                  ggsignif_0.6.4              Matrix_1.5-4.1              tzdb_0.4.0                 
[106] pkgconfig_2.0.3             tools_4.3.0                 cachem_1.0.8                rbibutils_2.2.13            RSQLite_2.3.1              
[111] viridisLite_0.4.2           DBI_1.1.3                   numDeriv_2016.8-1.1         fastmap_1.1.1               rmarkdown_2.23             
[116] scales_1.2.1                ica_1.0-3                   broom_1.0.5                 sass_0.4.6                  patchwork_1.1.2            
[121] carData_3.0-5               RANN_2.6.1                  farver_2.1.1                yaml_2.3.7                  MatrixGenerics_1.12.2      
[126] cli_3.6.1                   purrr_1.0.1                 leiden_0.4.3                lifecycle_1.0.3             rsconnect_1.2.0            
[131] uwot_0.1.16                 mvtnorm_1.2-2               backports_1.4.1             gtable_0.3.3                rjson_0.2.21               
[136] ggridges_0.5.4              progressr_0.13.0            parallel_4.3.0              limma_3.56.2                jsonlite_1.8.7             
[141] bitops_1.0-7                bit64_4.0.5                 qqconf_1.3.2                Rtsne_0.16                  spatstat.utils_3.0-3       
[146] zip_2.3.0                   mutoss_0.1-13               jquerylib_0.1.4             R.utils_2.12.2              lazyeval_0.2.2             
[151] shiny_1.7.4                 htmltools_0.5.5             sctransform_0.3.5           rappdirs_0.3.3              glue_1.6.2                 
[156] XVector_0.40.0              RCurl_1.98-1.12             mnormt_2.1.1                igraph_1.5.0                R6_2.5.1                   
[161] tidyr_1.3.0                 labeling_0.4.2              GenomeInfoDb_1.36.1         DelayedArray_0.26.3         tidyselect_1.2.0           
[166] vipor_0.4.5                 plotrix_3.8-2               car_3.1-2                   future_1.33.0               munsell_0.5.0              
[171] KernSmooth_2.23-21          data.table_1.14.8           htmlwidgets_1.6.2           rlang_1.1.1                 spatstat.sparse_3.0-2      
[176] spatstat.explore_3.2-1      fansi_1.0.4                 beeswarm_0.4.0             
LS0tCnRpdGxlOiAiZ2VuZS1leHByLWNsdXN0ZXJpbmctU2V1cmF0LlIiCm91dHB1dDoKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKVGhpcyBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2sgcmVwcm9kdWNlcyB0aGUgYW5hbHlzaXMgb2YgVEUwMDEgYXQgdGhlIGdlbmUgZXhwcmVzc2lvbiBsZXZlbC4gVGhlIGZpcnN0IHNlY3Rpb24gb2YgdGhlIFR1dG9yaWFsIG1ha2VzIHVzZSBvZiB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzIG9mIHRoZSBTZXVyYXQgcGlwZWxpbmUuIFRoZSBzZWNvbmQgcGFydCBvZiB0aGUgdHV0b3JpYWwgZmluZHMgYSBjbG9zZS10by1vcHRpbWFsIGNsdXN0ZXJpbmcgc29sdXRpb24gb2J0YWluZWQgd2l0aCB0aGUgTG91dmFpbiBhbGdvcml0aG0sIGJ5IHJldHVybmluZyB0aGUgc29sdXRpb24gd2l0aCB0aGUgaGlnaGVzdCBzaWxob3VldHRlIGJ5IG9wdGltaXppbmcgb3ZlciB0d28gcGFyYW1ldGVycywgdGhlIG51bWJlciBvZiBuZWFyZXN0IG5laWdoYm9ycyAoYE5OYCkgYW5kIHRoZSByZXNvbHV0aW9uIChgcmVzYCkuCgojIyMgMS4gU2V0dXAgZGlyZWN0b3JpZXMgYW5kIHVzZXItZGVmaW5lZCBwYXJhbWV0ZXJzCgpDbGVhbiB0aGUgZW52aXJvbm1lbnQuCgpgYGB7cn0Kcm0obGlzdCA9IGxzKCkpIApgYGAKClNldCBwYXRocyB0byB0aGUgZm9sZGVycyBjb250YWluaW5nIGRhdGEsIG1ldGFkYXRhLCBvdXRwdXQgZmlndXJlcyBhbmQgc2F2aW5nIGRpcmVjdG9yeSAodG8gc2F2ZSkKCmBgYHtyfQpEYXRhRm9sZGVyIDwtICIvVm9sdW1lcy9hY19sYWJfc2NyYXRjaC9sejI4NDEvaWNzLXJlYnV0dGFsL1RFMDAxL2ZpbHRlcmVkX2ZlYXR1cmVfYmNfbWF0cml4LyIKbWV0YWRhdGFfcGF0aCA8LSAiL1ZvbHVtZXMvYWNfbGFiX3NjcmF0Y2gvbHoyODQxL2ljcy1yZWJ1dHRhbC9URTAwMS1oNWFkLyIKc2F2aW5nc0ZvbGRlciA8LSBEYXRhRm9sZGVyCmZpZ3VyZXNfcGF0aCA9ICIvVm9sdW1lcy9hY19sYWJfc2NyYXRjaC9sejI4NDEvaWNzLXJlYnV0dGFsL2ZpZ3VyZXMvVEUwMDFfZ0V4cHJfY2x1c3RlcmluZy8iCmBgYAoKRGVjaWRlIHdoZXRoZXIgdG8gb3B0aW1pemUgdGhlIGNsdXN0ZXJpbmcgc29sdXRpb24gKGxhdGVyIG9uLCBpbiB0aGlzIG1hcmtkb3duIGRvY3VtZW50KSBvciB3aGV0aGVyIHRvIHVzZSBwcmV2aW91c2x5IG9wdGltaXplZCBjbHVzdGVyaW5nIHBhcmFtZXRlcnMuCgpgYGB7cn0KcnVubmluZ19jbHVzdGVyaW5nIDwtIEZBTFNFICMgZG8gbm90IHJlLXJ1biBjbHVzdGVyaW5nCmNhdCgiJ3J1bm5pZ19jbHVzdGVyaW5nJyBpcyBzZXQgdG86ICIsIHJ1bm5pbmdfY2x1c3RlcmluZywiXG4iKQpgYGAKCkRlZmluZSBwcmV2aW91c2x5IGRldGVybWluZWQgY2x1c3RlcmluZyBwYXJhbWV0ZXJzIChub3QgdXNlZCBpZiBgcnVubmluZ19jbHVzdGVyaW5nYCBpcyBzZXQgdG8gYEZBTFNFYCkuIFRoZXNlIHBhcmFtZXRlcnMgd2VyZSBvYnRhaW5lZCB3aXRoIGEgaXRlcmF0aXZlIHN1YmNsdXN0ZXJpbmcgcm91dGluZSwgYXMgdGhlIG9uZSBzaG93biBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIHVzaW5nIHRoZSBgYWNkY2AgcGFja2FnZSBhdmFpbGFibGUgYXQ6IDxodHRwczovL2dpdGh1Yi5jb20vY2FsaWZhbm8tbGFiL2FjZGM+LiBXaGlsZSB0aGUgcmVwcm9kdWNpYmlsaXR5IG9mIHRoZSBvYnRhaW4gc29sdXRpb24gd2FzIHRlc3RlZCwgZnV0dXJlIHVwZGF0ZXMgb2YgdGhlIHBhY2thZ2Ugb3IgZGlmZmVyZW50IGxhcHRvcCBjb25maWd1cmF0aW9uIG1pZ2h0IHJlc3VsdCBpbiBkaWZmZXJlbnQgc29sdXRpb25zLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSByZWNvbW1lbmQ6ICgxKSBsb2FkaW5nIHRoZSBTZXVyYXQgb2JqZWN0IGdlbmVyYXRlZCB3aXRoIHRoaXMgdHV0b3JpYWwgb3IgKDIpIHJlLXJ1bm5pbmcgdGhlIGNsdXN0ZXJpbmcgb3B0aW1pemF0aW9uIGZyb20gdGhlIHNjcmF0Y2gsIGJ5IHNldHRpbmcgYHJ1bm5pbmdfY2x1c3RlcmluZyA9IFRSVUVgLiBGb3IgZW5oYW5jZWQgcGVyZm9ybWFuY2UsIGBhY2RjYCBjb21lcyBhbHNvIHdpdGggYSBHcmlkIFNlYXJjaC1iYXNlZCBvcHRpbWl6YXRpb24gdGhhdCBhbGxvd3MgZm9yIG11bHRpLXRocmVhZCwgdGh1cyBzcGVlZGluZyB1cCB0aGUgY29tcHV0YXRpb24uCgpgYGB7cn0KIyBvcHRpbWFsIGNsdXN0ZXJpbmcgcGFyYW1ldGVycyAtIHByZXZpb3VzbHkgZGV0ZXJtaW5lZAojIHN0ZXAgMQpvcHRfcGFyYW0gPC0gYygwLjAzMDEzODU5LCAyMikgIyByZXMgTk4gCgojIHN0ZXAgMiAoc3ViY2x1c3RlcmluZykKb3B0aW1fcGFyX2xpc3QgPC0gbWF0cml4KGMoMC4wNTY1NTIzMiwgNywgMC4wODc2MjA0LCA4LCAwLjA2NjU5NjA0LCA3KSxieXJvdz1UUlVFLG5yb3c9MyxuY29sPTIpCmNvbG5hbWVzKG9wdGltX3Bhcl9saXN0KSA8LSBjKCJyZXMiLCAiTk4iKQpyb3duYW1lcyhvcHRpbV9wYXJfbGlzdCkgPC0gYygiMSIsICIzIiwgIjIiKQpgYGAKCkxvYWQgbGlicmFyaWVzLgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkobWF0cml4U3RhdHMpCmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KHRpYmJsZSkKbGlicmFyeShhY2RjKQpsaWJyYXJ5KGNsdXN0ZXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShmYWN0b2V4dHJhKQpsaWJyYXJ5KENvbXBsZXhIZWF0bWFwKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShjaXJjbGl6ZSkKbGlicmFyeShncmlkRXh0cmEpCmBgYAoKIyMjIDIuIExvYWQgZGF0YSwgcGVyZm9ybSBxdWFsaXR5IGNvbnRyb2wgYW5kIGNlbGwgZmlsdGVyaW5nCgpEZWZpbmUgdGhyZXNob2xkcyBmb3IgY2VsbCBmaWx0ZXJpbmcuCgpgYGB7cn0KbWluX2NlbGxzIDwtIDUKbWluX2ZlYXRzIDwtIDEwMDAKICAKbWluX25GZWF0dXJlX1JOQSA8LSAxNTAwCm1heF9uRmVhdHVyZV9STkEgPC0gMjAwMDAKbWF4X25Db3VudF9STkEgPC0gMTAwMDAwCm10X3BlcmNlbnRfdGhyZXNob2xkIDwtIDEwCmBgYAoKTG9hZCBVTUkgY291bnRzIGFuZCBjcmVhdGUgU2V1cmF0IE9iamVjdC4KCmBgYHtyfQojIGNvdW50cwpURTAwMV9kYXRhIDwtIFJlYWQxMFgoZmlsZS5wYXRoKGRhdGEuZGlyPWZpbGUucGF0aChEYXRhRm9sZGVyKSkpICMgbG9hZCBjb3VudHMKCiMgZ2VuZXJhdGUgU2V1cmF0IG9iamVjdCAgClRFMDAxIDwtIENyZWF0ZVNldXJhdE9iamVjdChjb3VudHM9VEUwMDFfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Q9IlRFMDAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2F5PSJSTkEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLmNlbGxzID0gbWluX2NlbGxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLmZlYXR1cmVzID0gbWluX2ZlYXRzKQogIApURTAwMUBtZXRhLmRhdGEkY2VsbF9pZCA8LSByb3duYW1lcyhURTAwMUBtZXRhLmRhdGEpIApURTAwMUBtZXRhLmRhdGEgPC0gVEUwMDFAbWV0YS5kYXRhICU+JSBkcGx5cjo6c2VsZWN0KC4sY2VsbF9pZCwgZXZlcnl0aGluZygpKQpgYGAKClZpc3VhbGl6ZSBRQyBhcyB2aW9saW4gcGxvdHMgYmVmb3JlIGZpbHRlcmluZy4KCmBgYHtyfQpURTAwMVtbInBlcmNlbnQubXQiXV0gPC0gUGVyY2VudGFnZUZlYXR1cmVTZXQoVEUwMDEsIHBhdHRlcm49Il5tdCIpCiAgClZsblBsb3QoVEUwMDEsIGZlYXR1cmVzID0gYygibkZlYXR1cmVfUk5BIiwgIm5Db3VudF9STkEiLCAicGVyY2VudC5tdCIpLCBuY29sID0gMywgcHQuc2l6ZT0wKQpgYGAKCkZpbHRlciBvdXQgbG93IHF1YWxpdHkgY2VsbHMgYW5kIHZpc3VhbGl6ZSBRQyBwbG90cyBhZnRlciBmaWx0ZXJpbmcuCgpgYGB7ciwgIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQojIEZpbHRlciBvdXQgY2VsbHMKVEUwMDEgPC0gc3Vic2V0KFRFMDAxLCBzdWJzZXQgPSBuRmVhdHVyZV9STkEgPiBtaW5fbkZlYXR1cmVfUk5BICYgbkZlYXR1cmVfUk5BIDwgbWF4X25GZWF0dXJlX1JOQSAmIG5Db3VudF9STkEgPCBtYXhfbkNvdW50X1JOQSAmIHBlcmNlbnQubXQgPCBtdF9wZXJjZW50X3RocmVzaG9sZCkKICAKIyBWaXN1YWxpemUgUUMgbWV0cmljcyBhcyBhIHZpb2xpbiBwbG90IEFGVEVSIGZpbHRlcmluZwpWbG5QbG90KFRFMDAxLCBmZWF0dXJlcyA9IGMoIm5GZWF0dXJlX1JOQSIsICJuQ291bnRfUk5BIiwgInBlcmNlbnQubXQiKSwgbmNvbCA9IDMsIHB0LnNpemU9MCkKICAKIyBGZWF0dXJlU2NhdHRlciBpcyB0eXBpY2FsbHkgdXNlZCB0byB2aXN1YWxpemUgZmVhdHVyZS1mZWF0dXJlIHJlbGF0aW9uc2hpcHMKcGxvdDEgPC0gRmVhdHVyZVNjYXR0ZXIoVEUwMDEsIGZlYXR1cmUxID0gIm5Db3VudF9STkEiLCBmZWF0dXJlMiA9ICJwZXJjZW50Lm10IiwgY29sPSJkYXJrZ3JheSIpCnBsb3QyIDwtIEZlYXR1cmVTY2F0dGVyKFRFMDAxLCBmZWF0dXJlMSA9ICJuQ291bnRfUk5BIiwgZmVhdHVyZTIgPSAibkZlYXR1cmVfUk5BIiwgY29sPSJkYXJrZ3JheSIpCgpncmlkLmFycmFuZ2UocGxvdDEsIHBsb3QyLCBuY29sID0gMikKYGBgCgpMb2FkIGFkZGl0aW9uYWwgbWV0YWRhdGEgYW5kIGluY2x1ZGUgaW4gU2V1cmF0IG9iamVjdC4KCmBgYHtyfQojIGxvYWQgYWRkaXRpb25hbCBtZXRhZGF0YSBmb3IgdGhlIGNlbGxzCm1ldGFkYXRhX2NzdiA8LSBmaWxlLnBhdGgobWV0YWRhdGFfcGF0aCwgIlRFMDAxLW1ldGFkYXRhLXVtYXAtYW5kLWNsdXN0ZXJzLWZvci1wYXBlci5jc3YiKQptZXRhZGF0YSA8LSByZWFkLmNzdihtZXRhZGF0YV9jc3YpCgojIGpvaW4gbWV0YWRhdGEgdG8gU2V1cmF0IG9iamVjdApURTAwMUBtZXRhLmRhdGEgPC0gVEUwMDFAbWV0YS5kYXRhICU+JSBkcGx5cjo6bGVmdF9qb2luKC4sIG1ldGFkYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoImNlbGxfaWQiID0gImNlbGxfaWQiKSkKcm93bmFtZXMoVEUwMDFAbWV0YS5kYXRhKSA8LSBURTAwMUBtZXRhLmRhdGEkY2VsbF9pZApgYGAKCiMjIyAzLiBBbmFseXNpcyBvZiBURTAwMSB3aXRoIHN0YW5kYXJkIFNldXJhdCB3b3JrZmxvdyBhbmQgY2x1c3RlcmluZyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyAKCkxvZy1Ob3JtYWxpemUgZGF0YSwgZmluZCBhbmQgZGlzcGxheSBoaWdobHkgdmFyaWFibGUgZ2VuZXMgYW5kIHNjYWxlIGRhdGEuCgpgYGB7cn0KIyBOb3JtYWxpemUgRGF0YQpURTAwMSA8LSBOb3JtYWxpemVEYXRhKFRFMDAxLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJMb2dOb3JtYWxpemUiLCBzY2FsZS5mYWN0b3IgPSAxMDAwMCkKICAKIyBGaW5kaW5nIFZhcmlhYmxlIGZlYXR1cmVzClRFMDAxIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKFRFMDAxLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDApCnRvcDEwX2h2ZyA8LSBoZWFkKFZhcmlhYmxlRmVhdHVyZXMoVEUwMDEpLCAxMCkKcGxvdDEgPC0gVmFyaWFibGVGZWF0dXJlUGxvdChURTAwMSkKcGxvdDIgPC0gTGFiZWxQb2ludHMocGxvdCA9IHBsb3QxLCBwb2ludHMgPSB0b3AxMF9odmcsIHJlcGVsID0gVFJVRSwgeG51ZGdlPTAsIHludWRnZT0wKQpwbG90MgpkZXYub2ZmKCkKICAKIyBTY2FsaW5nIHRoZSBkYXRhCmFsbC5nZW5lcyA8LSByb3duYW1lcyhURTAwMSkKVEUwMDEgPC0gU2NhbGVEYXRhKFRFMDAxLCBmZWF0dXJlcyA9IGFsbC5nZW5lcykKYGBgCgpDbHVzdGVyIGNlbGxzIHdpdGggTG91dmFpbiBhbGdvcml0aG0uIDAuNSBpcyB1c2VkIGFzIHRoZSByZXNvbHV0aW9uIHZhbHVlLCBhcyBpbiA8aHR0cHM6Ly9zYXRpamFsYWIub3JnL3NldXJhdC9hcnRpY2xlcy9wYm1jM2tfdHV0b3JpYWw+LgoKYGBge3J9CiMgUGVyZm9ybSBsaW5lYXIgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uClRFMDAxIDwtIFJ1blBDQShURTAwMSwgdmVyYm9zZT1GKQoKIyBDbHVzdGVyIHRoZSBjZWxscyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycwpURTAwMSA8LSBGaW5kTmVpZ2hib3JzKFRFMDAxLCBrLnBhcmFtID0gMjApClRFMDAxIDwtIEZpbmRDbHVzdGVycyhURTAwMSwgcmVzb2x1dGlvbiA9IDAuNSkgIwogIApsZXZlbHMoVEUwMDFAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycykgPC0gYXMuY2hhcmFjdGVyKGFzLm51bWVyaWMobGV2ZWxzKFRFMDAxQG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMpKSArIDEpCmBgYAoKRXZhbHVhdGUgdGhlIHF1YWxpdHkgb2YgY2x1c3RlcmluZyBzb2x1dGlvbiBieSB2aXN1YWxpemluZyB0aGUgU2lsaG91ZXR0ZSBTY29yZS4KCmBgYHtyfQojIGV2YWx1YXRlIGNsdXN0ZXJpbmcgc29sdXRpb24KUENzPC1hcy5kYXRhLmZyYW1lKFRFMDAxJHBjYUBjZWxsLmVtYmVkZGluZ3NbLDE6MTBdKQpldWNfZGlzdGFuY2U8LWRpc3QoUENzLCBtZXRob2Q9ImV1Y2xpZGVhbiIpCiAgCnMgPC0gc2lsaG91ZXR0ZSggYXMuaW50ZWdlcihURTAwMSRzZXVyYXRfY2x1c3RlcnMpICwgZXVjX2Rpc3RhbmNlICkKcGRmKGZpbGUucGF0aChmaWd1cmVzX3BhdGgsICJzaWxob3VldHRlX2RlZmF1bHQucGRmIikgLCB3aWR0aCA9IDYgLCBoZWlnaHQgPSA4KQpmdml6X3NpbGhvdWV0dGUocyxwcmludC5zdW1tYXJ5ID0gRkFMU0UpCQpkZXYub2ZmKCkKCmZ2aXpfc2lsaG91ZXR0ZShzLHByaW50LnN1bW1hcnkgPSBGQUxTRSkJCgpgYGAKClZpc3VhbGl6ZSBjbHVzdGVycyBhdCBnZW5lIGV4cHJlc3Npb24gb24gYSBVTUFQIGVtYmVkZGluZy4KCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD02fQpURTAwMSA8LSBSdW5VTUFQKFRFMDAxLCBkaW1zID0gMToxMCkKICAKcGRmKGZpbGUucGF0aChmaWd1cmVzX3BhdGgsICJ1bWFwX2NsdXN0ZXJzX2RlZmF1bHQucGRmIikgLHdpZHRoID0gMTIsIGhlaWdodCA9IDYpCkRpbVBsb3QoVEUwMDEsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgcHQuc2l6ZT0xLjUsIGdyb3VwLmJ5ID0gYygic2V1cmF0X2NsdXN0ZXJzIiwiaXRlcl9jbHVzdGVyX2lkX3dpdGhfcGFuZXRoIikpCiAgZGV2Lm9mZigpCiAgCnBkZihmaWxlLnBhdGgoZmlndXJlc19wYXRoLCAidW1hcF9kZWZhdWx0X2N5dG90cmFjZS5wZGYiKSAsIHdpZHRoID0gNiAsIGhlaWdodCA9IDYpCkZlYXR1cmVQbG90KFRFMDAxLCBmZWF0dXJlcyA9ICJjeXRvdHJhY2VfdGUwMDEiLCBwdC5zaXplPTEuNSkgJiBzY2FsZV9jb2xvcl92aXJpZGlzX2MoKQpkZXYub2ZmKCkKCiMgU2hvdyBmaWd1cmVzIGluIGNlbGwKRGltUGxvdChURTAwMSwgcmVkdWN0aW9uID0gInVtYXAiLCBwdC5zaXplPTEuNSwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIikKCkRpbVBsb3QoVEUwMDEsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgcHQuc2l6ZT0xLjUsIGdyb3VwLmJ5ID0gIml0ZXJfY2x1c3Rlcl9pZF93aXRoX3BhbmV0aCIpCgpGZWF0dXJlUGxvdChURTAwMSwgZmVhdHVyZXMgPSAiY3l0b3RyYWNlX3RlMDAxIiwgcHQuc2l6ZT0xLjUpICYgc2NhbGVfY29sb3JfdmlyaWRpc19jKCkKCmBgYAoKUGVyZm9ybSBkaWZmZXJlbnRpYWwgZ2VuZSBleHByZXNzaW9uIGFuYWx5c2lzIG9uIHRoZSBpZGVudGlmaWVkIGNsdXN0ZXJzIHdpdGggZGVmYXVsdCBTZXVyYXQgcGlwZWxpbmUKCmBgYHtyfQpJZGVudHMoVEUwMDEpIDwtICJzZXVyYXRfY2x1c3RlcnMiCiAgICAKIyBGaW5kQWxsTWFya2VycyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycwpURTAwMV9tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKFRFMDAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXkgPSAiUk5BIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2xvdD0iZGF0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QudXNlID0gIndpbGNveCIsIAogICAgICAgICAgICAgICAgICAgICAgICBvbmx5LnBvcyA9IFRSVUUpCiAgICAKdG9wMTBfbWFya2VycyA8LSBURTAwMV9tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24obiA9IDEwLCB3dCA9IGF2Z19sb2cyRkMpCmdlbmVzX2RlZmF1bHQgPC0gdG9wMTBfbWFya2VycyRnZW5lCmBgYAoKR2VuZXJhdGUgYSBoZWF0bWFwIHNob3dpbmcgdGhlIHRvcCAxMCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMgb24gYSBwZXItY2x1c3RlciBiYXNpcwoKYGBge3IsIGZpZy53aWR0aD0xOCwgZmlnLmhlaWdodD0yNH0KIyBWaXN1YWxpemUgY2x1c3RlcnMgYW5kIHRvcCBERSBnZW5lcyBvbiBhIGhlYXRtYXAKbWF0X3RvX3Nob3dfZGVmYXVsdCA8LSBhcy5tYXRyaXgoVEUwMDFAYXNzYXlzJFJOQUBkYXRhW2dlbmVzX2RlZmF1bHQsXSkKQ2x1c3RlcnMgPC0gVEUwMDEkc2V1cmF0X2NsdXN0ZXJzCmNvbG9ycyA8LSByYWluYm93KG5sZXZlbHMoQ2x1c3RlcnMpKSAKbmFtZXMoY29sb3JzKSA8LSBsZXZlbHMoQ2x1c3RlcnMpCiAgCiMgcHJlcGFyZSBkZl9hbm5vdC5kZiAKcGVyLmNlbGwuc2lsLndpZHRoIDwtIHNbLCJzaWxfd2lkdGgiXQpuYW1lcyhwZXIuY2VsbC5zaWwud2lkdGgpIDwtIGNvbG5hbWVzKFRFMDAxKQogIApkZl9hbm5vdC5kZiA8LSBURTAwMUBtZXRhLmRhdGEgJT4lCiAgZHBseXI6OnNlbGVjdChjbHVzdGVyX2lkPXNldXJhdF9jbHVzdGVycywgY3l0b3RyYWNlX3Njb3JlID0gY3l0b3RyYWNlX3RlMDAxKSAlPiUKICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguLHZhcj0iY2VsbF9pZCIpCmRmX2Fubm90LmRmJGNsdXN0ZXJfaWQgPC0gZmFjdG9yKGFzLm51bWVyaWMoZGZfYW5ub3QuZGYkY2x1c3Rlcl9pZCkpCiAgIAp4IDwtIGFzLmRhdGEuZnJhbWUocGVyLmNlbGwuc2lsLndpZHRoKSAlPiUKICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguLHZhcj0ic2FtcGxlX2lkIikgCiAgCmRmX2Fubm90LmRmIDwtIGxlZnRfam9pbihkZl9hbm5vdC5kZix4LGJ5PWMoImNlbGxfaWQiPSJzYW1wbGVfaWQiKSkKICAKc2FtcGxlX29yZGVyaW5nX3RvX3ByaW50IDwtIHJldiggb3JkZXIoIGRmX2Fubm90LmRmJHBlci5jZWxsLnNpbC53aWR0aCApICkKZGZfYW5ub3QuZGYgPC0gZGZfYW5ub3QuZGZbc2FtcGxlX29yZGVyaW5nX3RvX3ByaW50LF0KICAKbWF0X3RvX3Nob3dfZGVmYXVsdCA8LSBtYXRfdG9fc2hvd19kZWZhdWx0WyxtYXRjaChkZl9hbm5vdC5kZiRjZWxsX2lkLGNvbG5hbWVzKG1hdF90b19zaG93X2RlZmF1bHQpKV0KICAKc3RvcGlmbm90KGlkZW50aWNhbCggZGZfYW5ub3QuZGYkY2VsbF9pZCwgY29sbmFtZXMobWF0X3RvX3Nob3dfZGVmYXVsdCkgKSkKICAKIyB0aGUgc2lsaG91ZXR0ZSBzY29yZQpzaWwuZmlsbCA8LSByZXAoTkEsIG5yb3coZGZfYW5ub3QuZGYpKQp1bmlxdWVfY2x1c3RlcnMgPC0gdW5pcXVlKGRmX2Fubm90LmRmJGNsdXN0ZXJfaWQpCm5fY29sb3JzIDwtIGxlbmd0aChjb2xvcnMpCiAgCmNvbG9yX2luZGV4IDwtIDEKZm9yIChpIGluIHNlcV9hbG9uZyh1bmlxdWVfY2x1c3RlcnMpKSB7CiAgY2x1c3RlciA8LSB1bmlxdWVfY2x1c3RlcnNbaV0KICBzaWwuZmlsbFtkZl9hbm5vdC5kZiRjbHVzdGVyX2lkID09IGNsdXN0ZXJdIDwtIGNvbG9yc1tuYW1lcyhjb2xvcnMpID09IGNsdXN0ZXJdCiAgY29sb3JfaW5kZXggPC0gaSArIDEgICMgVXNlIG1vZHVsbyB0byBjeWNsZSB0aHJvdWdoIGNvbG9ycwp9CiAgCmRmX2Fubm90X2NvbHNfY2x1c3Rlcl9zY29yZSA8LSBIZWF0bWFwQW5ub3RhdGlvbiggCiAgc2lsaG91ZXR0ZV9zY29yZSA9IGFubm9fYmFycGxvdCgKICAgIGRmX2Fubm90LmRmJHBlci5jZWxsLnNpbC53aWR0aCwKICAgIGJhcl93aWR0aCA9IDEsCiAgICBncCA9IGdwYXIoY29sID0gTkEsIAogICAgICAgICAgICAgIGZvbnRzaXplID0gNiAsCiAgICAgICAgICAgICAgY2V4ID0gMC44ICwKICAgICAgICAgICAgICBmaWxsID0gIHNpbC5maWxsIAogICAgKSwKICAgIGJvcmRlciA9IEZBTFNFLAogICAgaGVpZ2h0ID0gdW5pdCgxLjI1LCAiY20iKSAsCiAgICB3aWR0aCA9IHVuaXQoMC41LCAiY20iKQogICkKKQogIAogIAojIGhlYXRtYXAgYW5ub3RhdGlvbgpkZl9hbm5vdC5kZiA8LSBkZl9hbm5vdC5kZiAlPiUgZHBseXI6OnNlbGVjdChjbHVzdGVyX2lkKQpjbHVzdGVyX2NvbG9ycyA8LSBjb2xvcnNbICFpcy5uYShuYW1lcyhjb2xvcnMpKSBdCmRmX2Fubm90X2NvbHMgPSBIZWF0bWFwQW5ub3RhdGlvbiggZGYgPSBkZl9hbm5vdC5kZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBsaXN0KGNsdXN0ZXJfaWQ9Y2x1c3Rlcl9jb2xvcnMpICAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfbGVnZW5kID0gVFJVRSAsIG5hX2NvbCA9ICJncmF5OTUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fbmFtZV9ncCA9IGdwYXIoZm9udHNpemU9MC4xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogIAp0b3AxMF9kZWZhdWx0X2htIDwtIEhlYXRtYXAoIG1hdF90b19zaG93X2RlZmF1bHQsCiAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGNpcmNsaXplOjpjb2xvclJhbXAyKHJhbmdlKG1hdF90b19zaG93X2RlZmF1bHQpLzIsIGMoImRhcmtzbGF0ZWJsdWUiLCAieWVsbG93IikpLAogICAgICAgICAgICAgICAgICAgICB1c2VfcmFzdGVyID0gRkFMU0UgLAogICAgICAgICAgICAgICAgICAgICBjb2x1bW5fc3BsaXQgPSBkZl9hbm5vdC5kZiRjbHVzdGVyX2lkLAogICAgICAgICAgICAgICAgICAgICBoZWF0bWFwX2xlZ2VuZF9wYXJhbSA9IGxpc3QoY29sb3JfYmFyID0gImNvbnRpbnVvdXMiKSAsCQogICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSAsCiAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFICwKICAgICAgICAgICAgICAgICAgICAgc2hvd19jb2x1bW5fbmFtZXMgPSBGQUxTRSAsCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiR2VuZSBFeHByZXNzaW9uIChsb2cxcCkiICwgIAogICAgICAgICAgICAgICAgICAgICByb3dfbmFtZXNfZ3AgPSBncGFyKGZvbnRzaXplID0gMTApICwgY29sdW1uX25hbWVzX2dwID0gZ3Bhcihmb250c2l6ZT04KSwKICAgICAgICAgICAgICAgICAgICAgcm93X3RpdGxlX3NpZGUgPSAibGVmdCIgLCByb3dfdGl0bGVfZ3AgPSBncGFyKGZvbnRzaXplID0gMTAsIGZvbnRmYWNlPSJib2xkIikgICAgCiAgICAgICAgICAgICAgICAgICAgICkKICAKICAKICAKaHRfdG9wMTBfbGlzdCA9IGRmX2Fubm90X2NvbHNfY2x1c3Rlcl9zY29yZSAldiUgZGZfYW5ub3RfY29scyAldiUgdG9wMTBfZGVmYXVsdF9obQogIApwZGYoZmlsZS5wYXRoKGZpZ3VyZXNfcGF0aCwidG9wXzEwX2RlZmF1bHRfaGVhdG1hcC5wZGYiKSwgd2lkdGggPSAxNSwgaGVpZ2h0ID0gMjMpCnAgPC0gZHJhdyhodF90b3AxMF9saXN0LCBjb2x1bW5fa20gPSAxICwgCiAgICAgICAgICBoZWF0bWFwX2xlZ2VuZF9zaWRlID0gInJpZ2h0IiwgCiAgICAgICAgICBhbm5vdGF0aW9uX2xlZ2VuZF9zaWRlID0gImJvdHRvbSIgKQpkZXYub2ZmKCkKCnAKYGBgCgpEaXNwbGF5IGEgZG90cGxvdCB3aXRoIHRoZSB0b3AgNSBnZW5lcyBwZXIgY2x1c3RlciAodXNpbmcgdGhlIGBkYXRhYCBzbG90KS4KCmBgYHtyLCBmaWcud2lkdGg9MjQsIGZpZy5oZWlnaHQ9MTJ9CnRvcDVfbWFya2VycyA8LSBURTAwMV9tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24obiA9IDUsIHd0ID0gYXZnX2xvZzJGQykKICAKZ2VuZXNfZHBfZGVmYXVsdCA8LSB0b3A1X21hcmtlcnMkZ2VuZSAlPiUgdW5pcXVlKCkKICAKIyBpbnRpYWxpemUgbGlzdHMgY29udGFpbmluZyBkYXRhZnJhbWVzIApBdmdzX2RlZmF1bHQgPC0gdmVjdG9yKCBtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChsZXZlbHMoVEUwMDEkc2V1cmF0X2NsdXN0ZXJzKSkgKQpuYW1lcyhBdmdzX2RlZmF1bHQpIDwtIGxldmVscyhURTAwMSRzZXVyYXRfY2x1c3RlcnMpCiAgClBjdF9kZWZhdWx0IDwtIHZlY3RvciggbW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgobGV2ZWxzKFRFMDAxJHNldXJhdF9jbHVzdGVycykpICkKbmFtZXMoUGN0X2RlZmF1bHQpIDwtIGxldmVscyhURTAwMSRzZXVyYXRfY2x1c3RlcnMpCiAgCmZvciAoY2x1c3RlciBpbiBsZXZlbHMoVEUwMDEkc2V1cmF0X2NsdXN0ZXJzKSl7CiAgICAKICBjZWxsc19pbl9jbHVzdGVyIDwtIFRFMDAxJHNldXJhdF9jbHVzdGVycyA9PSBjbHVzdGVyCiAgICAKICAjIEF2Z19kZWZhdWx0CiAgQXZnc19kZWZhdWx0W1tjbHVzdGVyXV0gPC0gVEUwMDFbWyJSTkEiXV1AZGF0YVtnZW5lc19kcF9kZWZhdWx0LCBjZWxsc19pbl9jbHVzdGVyXSAlPiUKICAgIHJvd01lYW5zKCkgJT4lIAogICAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICAgIHJvd25hbWVzX3RvX2NvbHVtbigpICU+JQogICAgZHBseXI6OnJlbmFtZSguLCJHZW5lIj1yb3duYW1lLCJtZWFuIj0uKSAlPiUgCiAgICBkcGx5cjo6bXV0YXRlKGNsdXN0ZXI9Y2x1c3RlcikKICAgIAogICMgUGN0CiAgUGN0X2RlZmF1bHRbW2NsdXN0ZXJdXSA8LSBURTAwMVtbIlJOQSJdXUBkYXRhW2dlbmVzX2RwX2RlZmF1bHQsIGNlbGxzX2luX2NsdXN0ZXJdICU+JQogICAgYXBwbHkoLiwxLCBmdW5jdGlvbih4KXsgc3VtKHg+MCkvbGVuZ3RoKHgpKjEwMCB9KSAlPiUKICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUKICAgIHJvd25hbWVzX3RvX2NvbHVtbigpICU+JQogICAgZHBseXI6OnJlbmFtZSguLCJHZW5lIj1yb3duYW1lLCJQY3QiPS4pICU+JQogICAgZHBseXI6Om11dGF0ZShjbHVzdGVyPWNsdXN0ZXIpCiAgICAKfQogIAojIE1lYW4KZGZfbWVhbi5HRXhfZGVmYXVsdCA8LSBkby5jYWxsKHJiaW5kLCBBdmdzX2RlZmF1bHQpCnJvd25hbWVzKGRmX21lYW4uR0V4X2RlZmF1bHQpIDwtIE5VTEwKIyBQY3QKZGZfcGN0LkdFeF9kZWZhdWx0IDwtIGRvLmNhbGwocmJpbmQsIFBjdF9kZWZhdWx0KQpyb3duYW1lcyhkZl9wY3QuR0V4X2RlZmF1bHQpIDwtIE5VTEwKICAKIyBTdW1tYXJ5CnN1bW1hcnkuR0V4X2RlZmF1bHQgPC0gY2JpbmQoZGZfbWVhbi5HRXhfZGVmYXVsdFssMToyXSxkZl9wY3QuR0V4X2RlZmF1bHRbLDI6M10pIApzdW1tYXJ5LkdFeF9kZWZhdWx0JEdlbmUgPC0gZmFjdG9yKHN1bW1hcnkuR0V4X2RlZmF1bHQkR2VuZSwgbGV2ZWxzPWdlbmVzX2RwX2RlZmF1bHQsIG9yZGVyZWQgPSBUUlVFKSAKICAKIyBQcmludGluZyBkb3RwbG90IGZvciBnZW5lcwpjYXQoIlByaW50aW5nIGRvdHBsb3RzLi5cbiIpCkdFeC5ER0VfRG90UGxvdF9kZWZhdWx0IDwtIGdncGxvdChzdW1tYXJ5LkdFeF9kZWZhdWx0LCBhZXMoeD1HZW5lLHk9Y2x1c3RlcikpICsKICBnZW9tX3BvaW50KGFlcyhzaXplID0gUGN0LCBmaWxsPSBtZWFuKSwgY29sb3I9ImJsYWNrIiwgc2hhcGU9MjEpICsKICBzY2FsZV9zaXplKCIlIGRldGVjdGVkIiwgcmFuZ2UgPSBjKDAsMTUpLCBicmVha3M9YygwLDI1LDUwLDc1LDEwMCksIGxpbWl0cz1jKDAsMTAwKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0ic3RlZWxibHVlMSIsIGhpZ2ggPSAicmVkIiwgbWlkPSJ3aGl0ZSIsbWlkcG9pbnQ9MCwKICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9cmFuZ2Uoc3VtbWFyeS5HRXhfZGVmYXVsdCRtZWFuKSwKICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKHRpY2tzLmNvbG91ciA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5jb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkF2ZXJhZ2UgRXhwcmVzc2lvblxubG9nMXAoY291bnRzKSIpICsKICB5bGFiKCJDbHVzdGVyIikgKyB4bGFiKCIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgYW5nbGU9NDUsIGhqdXN0PTEsIGNvbG9yPSJibGFjayIpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTIsIGNvbG9yPSJibGFjayIpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCkgLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICAgICAgICApIAogIAogIApwZGYoZmlsZS5wYXRoKGZpZ3VyZXNfcGF0aCwgIkdFeC1ER0UtZG90cGxvdF9kZWZhdWx0LnBkZiIpICwgd2lkdGggPSAyNSAsIGhlaWdodCA9IDkpCnByaW50KEdFeC5ER0VfRG90UGxvdF9kZWZhdWx0KQpkZXYub2ZmKCkKICAKcHJpbnQoR0V4LkRHRV9Eb3RQbG90X2RlZmF1bHQpCmBgYAoKIyMjIDQuIEFuYWx5c2lzIG9mIFRFMDAxIHdpdGggb3B0aW1pemVkIGNsdXN0ZXJpbmcgc29sdXRpb24KClNjYWxlIGRhdGEgd2l0aCBgU0NUcmFuc2Zvcm1gIGFuZCBjb21wdXRlIFBDQS4KCmBgYHtyfQojIG5ldyBQQ0EgYW5kIFVNQVAgd2lsbCBiZSBjb21wdXRlZCAKVEUwMDFAcmVkdWN0aW9ucyRwY2EgPC0gTlVMTApURTAwMUByZWR1Y3Rpb25zJHVtYXAgPC0gTlVMTAogIAogIApURTAwMSA8LSBTQ1RyYW5zZm9ybShvYmplY3Q9VEUwMDEsCiAgICAgICAgICAgICAgICAgICAgIGFzc2F5PSJSTkEiLAogICAgICAgICAgICAgICAgICAgICBuY2VsbHM9bmNvbChURTAwMSksCiAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLmZlYXR1cmVzLm4gPSBsZW5ndGgoYWxsLmdlbmVzKSwKICAgICAgICAgICAgICAgICAgICAgZG8uY2VudGVyID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgZG8uc2NhbGUgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICBjb25zZXJ2ZS5tZW1vcnkgPSBUUlVFKQogIApURTAwMSA8LSBSdW5QQ0EoVEUwMDEsIGZlYXR1cmVzPWFsbC5nZW5lcywgdmVyYm9zZT1GKQpgYGAKCkNvbXB1dGUgY2x1c3RlcmluZyBzb2x1dGlvbiBhdCB0aGUgZ2VuZSBleHByZXNzaW9uIGxldmVsIGJ5IG9wdGltaXppbmcgdGhlIHNpbGhvdWV0dGUgc2NvcmUgd2l0aCBgYWNkY2AuIEJpZ2dlciBjbHVzdGVycyAoXD4xMDAgY2VsbHMpIGFyZSBzdWJjbHVzdGVyZWQgaW4gYSBzZWNvbmQgc3RlcCBmb3IgZmluZXIgZ3JhaW4gY2VsbCB0eXBlIGFzc2lnbm1lbnQuCgpbQ2x1c3RlcmluZyAoaXRlcmF0aW9uIDEpXXsudW5kZXJsaW5lfToKCmBgYHtyfQppZiAocnVubmluZ19jbHVzdGVyaW5nID09IFRSVUUpewogIGNhdCgiQ29tcHV0aW5nIGNsdXN0ZXJpbmcgc29sdXRpb24gYXQgZ2VuZSBleHByZXNzaW9uLi5cbiIpCiAgY29udHJvbCA8LSBsaXN0KG1heGl0PTFlNCwKICAgICAgICAgICAgICAgICAgc21vb3RoPUZBTFNFLAogICAgICAgICAgICAgICAgICBtYXgudGltZT02MCozMCwKICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmU9MWU5KQogICAgCiAgVEUwMDEgPC0gU0FDbHVzdGVyaW5nKFMub2JqID0gVEUwMDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2F5PSJTQ1QiLAogICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sPWNvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZnVuID0gImdyb3VwLm1lYW4uc2lsaG91ZXR0ZSIpCiAgICAKICBvcHRfcGFyYW0gPC0gVEUwMDFAYXNzYXlzJFNDVEBtaXNjJFNBLmhpc3Rvcnkkb3B0aW0ucGFyICMgcmVzLCBOTiAKfSBlbHNlIGlmIChydW5uaW5nX2NsdXN0ZXJpbmcgPT0gRkFMU0UpewogIGNhdCgiVXNpbmcgcHJldmlvdXNseSBpZGVudGlmaWVkIG9wdGltYWwgc29sdXRpb24gYXQgZ2VuZSBleHByZXNzaW9uLCB3aXRob3V0IHJlY29tcHV0aW5nIGl0Li5cbiIpCiAgICAKICBURTAwMSA8LSBnZXRGaW5hbChTLm9iaiA9IFRFMDAxLAogICAgICAgICAgICAgICAgICAgIGFzc2F5PSJTQ1QiLAogICAgICAgICAgICAgICAgICAgIHJlcz1vcHRfcGFyYW1bMV0sCiAgICAgICAgICAgICAgICAgICAgTk49b3B0X3BhcmFtWzJdLAogICAgICAgICAgICAgICAgICAgIHR5cGUuZnVuPSJncm91cC5tZWFuLnNpbGhvdWV0dGUiKQogICAgCn0KCiMgcmVuYW1lIGNsdXN0ZXJzIHN1Y2ggdGhhdCBsZXZlbHMgc3RhcnQgZnJvbSAxIGluc3RlYWQgb2YgMCwganVzdCBmb3IgY29uc2lzdGVuY3kKbGV2ZWxzKFRFMDAxJHNldXJhdF9jbHVzdGVycykgPC0gYXMuY2hhcmFjdGVyKGFzLm51bWVyaWMobGV2ZWxzKFRFMDAxJHNldXJhdF9jbHVzdGVycykpICsgMSkKYGBgCgpEaXNwbGF5IHRoZSBzaWxob3VldHRlIGFmdGVyIHRoZSBmaXJzdCBjbHVzdGVyaW5nIGl0ZXJhdGlvbi4KCmBgYHtyfQpucGNzIDwtIGRpbSggVEUwMDFAcmVkdWN0aW9ucyRwY2FAY2VsbC5lbWJlZGRpbmdzIClbMl0KICAKUENzPC1hcy5kYXRhLmZyYW1lKFRFMDAxJHBjYUBjZWxsLmVtYmVkZGluZ3NbLDE6bnBjc10pCmV1Y19kaXN0YW5jZTwtZGlzdChQQ3MsIG1ldGhvZD0iZXVjbGlkZWFuIikKcyA8LSBzaWxob3VldHRlKCBhcy5pbnRlZ2VyKFRFMDAxJHNldXJhdF9jbHVzdGVycykgLCBldWNfZGlzdGFuY2UgKQogIApwZGYoZmlsZS5wYXRoKGZpZ3VyZXNfcGF0aCwgInN0ZXBfMV9zaWxob3VldHRlLnBkZiIpICwgd2lkdGggPSA2ICwgaGVpZ2h0ID0gOCkKZnZpel9zaWxob3VldHRlKHMscHJpbnQuc3VtbWFyeSA9IEZBTFNFKQkJCQpkZXYub2ZmKCkKCmZ2aXpfc2lsaG91ZXR0ZShzLHByaW50LnN1bW1hcnkgPSBGQUxTRSkJCQkKYGBgCgpTaG93IGNsdXN0ZXJpbmcgc29sdXRpb24gYWZ0ZXIgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvbiBhIFVNQVAgZW1iZWRkaW5ncy4gVGhlIGZpcnN0IFVNQVAgdmlzdWFsaXphdGlvbiBpcyB0aGUgb25lIGNvbXB1dGVkIGF0IGdlbmUgZXhwcmVzc2lvbiBsZXZlbCwgdGhlIHNlY29uZCBVTUFQIHZpc3VhbGl6YXRpb24gaXMgdGhlIG9uZSBjb21wdXRlZCBhdCBwcm90ZWluIGFjdGl2aXR5LgoKYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQpucGNzIDwtIGRpbSggVEUwMDFAcmVkdWN0aW9ucyRwY2FAY2VsbC5lbWJlZGRpbmdzIClbMl0KICAKVEUwMDEgPC0gUnVuVU1BUChURTAwMSwgZGltcyA9IDE6bnBjcywgdmVyYm9zZT1GKQogIApwZGYoZmlsZS5wYXRoKGZpZ3VyZXNfcGF0aCwic3RlcF8xX2NsdXN0ZXJpbmdfdW1hcC5wZGYiKSwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gNikgICMgQWRqdXN0IHdpZHRoIGFuZCBoZWlnaHQgYXMgbmVlZGVkCkRpbVBsb3QoVEUwMDEsIGdyb3VwLmJ5PWMoInNldXJhdF9jbHVzdGVycyIsICJpdGVyX2NsdXN0ZXJfaWRfd2l0aF9wYW5ldGgiKSwgcmVkdWN0aW9uPSJ1bWFwIiwgcHQuc2l6ZT0xLjUpCmRldi5vZmYoKQoKRGltUGxvdChURTAwMSwgZ3JvdXAuYnk9Yygic2V1cmF0X2NsdXN0ZXJzIiwgIml0ZXJfY2x1c3Rlcl9pZF93aXRoX3BhbmV0aCIpLCByZWR1Y3Rpb249InVtYXAiLCBwdC5zaXplPTEuNSkKCiAgClRFMDAxQHJlZHVjdGlvbnMkdW1hcEBjZWxsLmVtYmVkZGluZ3MgPC0gYXMubWF0cml4KCBURTAwMUBtZXRhLmRhdGFbYygiVU1BUF8xX3NjYW5weSIsIlVNQVBfMl9zY2FucHkiKV0gKQpjb2xuYW1lcyhURTAwMUByZWR1Y3Rpb25zJHVtYXBAY2VsbC5lbWJlZGRpbmdzKSA8LSBjKCJVTUFQXzEiLCAiVU1BUF8yIikKICAKICAKcGRmKGZpbGUucGF0aChmaWd1cmVzX3BhdGgsInN0ZXBfMV9jbHVzdGVyaW5nX3VtYXBfcGEucGRmIiksIHdpZHRoID0gMTIsIGhlaWdodCA9IDYpCkRpbVBsb3QoVEUwMDEsIGdyb3VwLmJ5PWMoInNldXJhdF9jbHVzdGVycyIsICJpdGVyX2NsdXN0ZXJfaWRfd2l0aF9wYW5ldGgiKSwgcmVkdWN0aW9uPSJ1bWFwIiwgcHQuc2l6ZT0xLjUpCmRldi5vZmYoKQogIAoKRGltUGxvdChURTAwMSwgZ3JvdXAuYnk9Yygic2V1cmF0X2NsdXN0ZXJzIiwgIml0ZXJfY2x1c3Rlcl9pZF93aXRoX3BhbmV0aCIpLCByZWR1Y3Rpb249InVtYXAiLCBwdC5zaXplPTEuNSkKYGBgCgpbQ2x1c3RlcmluZyAoaXRlcmF0aW9uIDIpXXsudW5kZXJsaW5lfToKCmBgYHtyfQoKIyBTcGxpdCBieSBjbHVzdGVyIGFuZCBzdWJjbHVzdGVyClRFMDAxX2xpc3QgPC0gU3BsaXRPYmplY3Qob2JqZWN0PVRFMDAxLCBzcGxpdC5ieT0ic2V1cmF0X2NsdXN0ZXJzIikKICAKVEUwMDFfY2x1c3RlcnMgPC0gVEUwMDEkc2V1cmF0X2NsdXN0ZXJzICU+JSB1bmlxdWUoKQogIApjYXQoIlN1YmNsdXN0ZXJpbmcgb25seSBjbHVzdGVycyB3aXRoIGF0IGxlYXN0IDEwMCBjZWxscy4uXG4iKQpuX2NlbGxzX3Blcl9jbHVzdGVyIDwtIHNhcHBseShURTAwMV9saXN0LCBmdW5jdGlvbih4KXtkaW0oeClbMl19KSAKVEUwMDFfY2x1c3RlcnNfdG9fc3ViY2x1c3RlciA8LSBURTAwMV9jbHVzdGVyc1tuX2NlbGxzX3Blcl9jbHVzdGVyID49MTAwXQogIAppZiAocnVubmluZ19jbHVzdGVyaW5nID09IFRSVUUpewogIG9wdGltX3Bhcl9saXN0IDwtIG1hdHJpeChOQSwgbnJvdz1sZW5ndGgoVEUwMDFfY2x1c3RlcnNfdG9fc3ViY2x1c3RlciksIG5jb2w9MikKICBjb2xuYW1lcyhvcHRpbV9wYXJfbGlzdCkgPC0gYygicmVzIiwgIk5OIikKICByb3duYW1lcyhvcHRpbV9wYXJfbGlzdCkgPC0gYXMuY2hhcmFjdGVyKFRFMDAxX2NsdXN0ZXJzX3RvX3N1YmNsdXN0ZXIpCiAgCiAgY2F0KCJTdWJjbHVzdGVyaW5nIG9uIGEgY2x1c3RlciBieSBjbHVzdGVyIGJhc2lzLi5cbiIpCiAgZm9yIChrIGluIFRFMDAxX2NsdXN0ZXJzX3RvX3N1YmNsdXN0ZXIpewogICAgCiAgICBURTAwMV9saXN0W1trXV0gPC0gU0FDbHVzdGVyaW5nKFMub2JqID0gVEUwMDFfbGlzdFtba11dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXk9IlNDVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sPWNvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLmZ1biA9ICJncm91cC5tZWFuLnNpbGhvdWV0dGUiKQogICAgCiAgIyByZW5hbWUgY2x1c3RlcnMgc3VjaCB0aGF0IGxldmVscyBzdGFydCBmcm9tIDEgaW5zdGVhZCBvZiAwCiAgbGV2ZWxzKFRFMDAxX2xpc3RbW2tdXUBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzKSA8LSBhcy5jaGFyYWN0ZXIoYXMubnVtZXJpYyhsZXZlbHMoVEUwMDFfbGlzdFtba11dQG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMpKSArIDEpCiAgIyBzdG9yZSBuYW1lIGZvciBicmFuY2hpbmcKICBURTAwMV9saXN0W1trXV1AbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycyA8LSBwYXN0ZTAoaywiXyIsVEUwMDFfbGlzdFtba11dQG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMpCiAgICAKICBvcHRpbV9wYXJfbGlzdFtrLF0gPC0gIFRFMDAxX2xpc3RbW2tdXUBhc3NheXMkU0NUQG1pc2MkU0EuaGlzdG9yeSRvcHRpbS5wYXIgIyByZXMsIE5OIAogIH0KfSBlbHNlIGlmIChydW5uaW5nX2NsdXN0ZXJpbmcgPT0gRkFMU0UpewogIGNhdCgiU3ViY2x1c3RlcmluZyBvbiBhIGNsdXN0ZXIgYnkgY2x1c3RlciBiYXNpcyBieSB1c2luZyB0aGUgcHJldmlvdXNseSBvcHRpbWl6ZWQgY2x1c3RlcmluZyBwYXJhbWV0ZXJzLi5cbiIpCiAgICAKICBmb3IgKGsgaW4gVEUwMDFfY2x1c3RlcnNfdG9fc3ViY2x1c3Rlcil7CiAgICAgIAogICAgb3B0X3JlcyA8LSBvcHRpbV9wYXJfbGlzdFtrLCJyZXMiXQogICAgb3B0X05OIDwtIG9wdGltX3Bhcl9saXN0W2ssIk5OIl0KICAgIFRFMDAxX2xpc3RbW2tdXSA8LSBnZXRGaW5hbChTLm9iaiA9IFRFMDAxX2xpc3RbW2tdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzYXk9IlNDVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcz1vcHRfcmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOTj1vcHRfTk4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZnVuID0gImdyb3VwLm1lYW4uc2lsaG91ZXR0ZSIpCiAgICAgIAogICAgbGV2ZWxzKFRFMDAxX2xpc3RbW2tdXUBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzKSA8LSBhcy5jaGFyYWN0ZXIoYXMubnVtZXJpYyhsZXZlbHMoVEUwMDFfbGlzdFtba11dQG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMpKSArIDEpCiAgICBURTAwMV9saXN0W1trXV1AbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycyA8LSBwYXN0ZTAoaywiXyIsVEUwMDFfbGlzdFtba11dQG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMpCiB9Cn0KICAKVEUwMDFfbGlzdFtba11dQG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMgPC0gYXMuZmFjdG9yKFRFMDAxX2xpc3RbW2tdXUBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzKQoKIyByZW1lcmdlIFNldXJhdCBvYmplY3RzIGludG8gb25lIFNldXJhdCBvYmplY3QgClRFMDAxX3N1YmNsdXN0ZXJpbmcgPC0gbWVyZ2UoeD1URTAwMV9saXN0W1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1URTAwMV9saXN0WzI6bGVuZ3RoKFRFMDAxX2xpc3QpXSkKYGBgCgpEaXNwbGF5IHRoZSBzaWxob3VldHRlIGFmdGVyIHRoZSBzZWNvbmQgY2x1c3RlcmluZyBpdGVyYXRpb24uCgpgYGB7cn0KIyBSZS1ydW4gUENBIHRvIHZpc3VhbGl6ZSBpdApURTAwMV9zdWJjbHVzdGVyaW5nIDwtIFJ1blBDQShURTAwMV9zdWJjbHVzdGVyaW5nLCBmZWF0dXJlcz1hbGwuZ2VuZXMsIHZlcmJvc2U9RikKICAKbnBjcyA8LSBkaW0oIFRFMDAxX3N1YmNsdXN0ZXJpbmdAcmVkdWN0aW9ucyRwY2FAY2VsbC5lbWJlZGRpbmdzIClbMl0KICAKUENzPC1hcy5kYXRhLmZyYW1lKFRFMDAxX3N1YmNsdXN0ZXJpbmckcGNhQGNlbGwuZW1iZWRkaW5nc1ssMTpucGNzXSkKZXVjX2Rpc3RhbmNlPC1kaXN0KFBDcywgbWV0aG9kPSJldWNsaWRlYW4iKQogIApURTAwMV9zdWJjbHVzdGVyaW5nQG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMgPC0gYXMuZmFjdG9yKFRFMDAxX3N1YmNsdXN0ZXJpbmdAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycykKICAKICAKcyA8LSBzaWxob3VldHRlKCBhcy5pbnRlZ2VyKFRFMDAxX3N1YmNsdXN0ZXJpbmckc2V1cmF0X2NsdXN0ZXJzKSAsIGV1Y19kaXN0YW5jZSApCiAgCnBkZihmaWxlLnBhdGgoZmlndXJlc19wYXRoLCAic3RlcF8yX3NpbGhvdWV0dGUucGRmIikgLCB3aWR0aCA9IDYgLCBoZWlnaHQgPSA4KQpmdml6X3NpbGhvdWV0dGUocyxwcmludC5zdW1tYXJ5ID0gRkFMU0UpCQkJCmRldi5vZmYoKQogIApmdml6X3NpbGhvdWV0dGUocyxwcmludC5zdW1tYXJ5ID0gRkFMU0UpCQkJCmBgYAoKU2hvdyBjbHVzdGVyaW5nIHNvbHV0aW9uIGFmdGVyIHRoZSBmaXJzdCBpdGVyYXRpb24gb24gYSBVTUFQIGVtYmVkZGluZ3MuIFRoZSBmaXJzdCBVTUFQIHZpc3VhbGl6YXRpb24gaXMgdGhlIG9uZSBjb21wdXRlZCBhdCBnZW5lIGV4cHJlc3Npb24gbGV2ZWwsIHRoZSBzZWNvbmQgVU1BUCB2aXN1YWxpemF0aW9uIGlzIHRoZSBvbmUgY29tcHV0ZWQgYXQgcHJvdGVpbiBhY3Rpdml0eS4KCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Nn0KVEUwMDFfc3ViY2x1c3RlcmluZyA8LSAgUnVuVU1BUChURTAwMV9zdWJjbHVzdGVyaW5nLCBkaW1zID0gMTpucGNzLCB2ZXJib3NlPUYpCgpwZGYoZmlsZS5wYXRoKGZpZ3VyZXNfcGF0aCwic3RlcF8yX2NsdXN0ZXJpbmdfdW1hcC5wZGYiKSwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gNikgCkRpbVBsb3QoVEUwMDFfc3ViY2x1c3RlcmluZywgZ3JvdXAuYnk9Yygic2V1cmF0X2NsdXN0ZXJzIiwgIml0ZXJfY2x1c3Rlcl9pZF93aXRoX3BhbmV0aCIpLCAKICAgICAgICAgIHJlZHVjdGlvbj0idW1hcCIsIHB0LnNpemU9MS41ICkKZGV2Lm9mZigpCiAgCkRpbVBsb3QoVEUwMDFfc3ViY2x1c3RlcmluZywgZ3JvdXAuYnk9Yygic2V1cmF0X2NsdXN0ZXJzIiwgIml0ZXJfY2x1c3Rlcl9pZF93aXRoX3BhbmV0aCIpLCAKICAgICAgICAgIHJlZHVjdGlvbj0idW1hcCIsIHB0LnNpemU9MS41ICkKICAKVEUwMDFfc3ViY2x1c3RlcmluZ0ByZWR1Y3Rpb25zJHVtYXBAY2VsbC5lbWJlZGRpbmdzIDwtIGFzLm1hdHJpeCggVEUwMDFfc3ViY2x1c3RlcmluZ0BtZXRhLmRhdGFbYygiVU1BUF8xX3NjYW5weSIsIlVNQVBfMl9zY2FucHkiKV0gKQpjb2xuYW1lcyhURTAwMV9zdWJjbHVzdGVyaW5nQHJlZHVjdGlvbnMkdW1hcEBjZWxsLmVtYmVkZGluZ3MpIDwtIGMoIlVNQVBfMSIsICJVTUFQXzIiKQogIApwZGYoZmlsZS5wYXRoKGZpZ3VyZXNfcGF0aCwic3RlcF8yX2NsdXN0ZXJpbmdfdW1hcF9wYS5wZGYiKSwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gNikKRGltUGxvdChURTAwMV9zdWJjbHVzdGVyaW5nLCBncm91cC5ieT1jKCJzZXVyYXRfY2x1c3RlcnMiLCAiaXRlcl9jbHVzdGVyX2lkX3dpdGhfcGFuZXRoIiksIAogICAgICAgIHJlZHVjdGlvbj0idW1hcCIsIHB0LnNpemU9MS41ICkKZGV2Lm9mZigpCiAgCkRpbVBsb3QoVEUwMDFfc3ViY2x1c3RlcmluZywgZ3JvdXAuYnk9Yygic2V1cmF0X2NsdXN0ZXJzIiwgIml0ZXJfY2x1c3Rlcl9pZF93aXRoX3BhbmV0aCIpLCAKICAgICAgICByZWR1Y3Rpb249InVtYXAiLCBwdC5zaXplPTEuNSApCmBgYAoKRGlzcGxheSBjeXRvdHJhY2Ugc2NvcmUgb24gYSBVTUFQLgoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTZ9CgpwZGYoZmlsZS5wYXRoKGZpZ3VyZXNfcGF0aCwic3RlcF8yX2NsdXN0ZXJpbmdfdW1hcF9wYV9jeXRvdHJhY2UucGRmIiksIHdpZHRoID0gNiwgaGVpZ2h0ID0gNikKRmVhdHVyZVBsb3QoVEUwMDFfc3ViY2x1c3RlcmluZywgZmVhdHVyZXMgPSAiY3l0b3RyYWNlX3RlMDAxIiwgcHQuc2l6ZT0xLjUpICYgc2NhbGVfY29sb3JfdmlyaWRpc19jKCkKZGV2Lm9mZigpCgpGZWF0dXJlUGxvdChURTAwMV9zdWJjbHVzdGVyaW5nLCBmZWF0dXJlcyA9ICJjeXRvdHJhY2VfdGUwMDEiLCBwdC5zaXplPTEuNSkgJiBzY2FsZV9jb2xvcl92aXJpZGlzX2MoKQoKYGBgCgpQZXJmb3JtIGRpZmZlcmVudGlhbCBnZW5lIGV4cHJlc3Npb24gYW5hbHlzaXMgb24gdGhlIGlkZW50aWZpZWQgY2x1c3RlcnMgYWZ0ZXIgdGhlIHNvbHV0aW9uIG9wdGltaXplZCBpbiAyIHN0ZXBzLgoKYGBge3J9CiMgUGVyZm9ybSBkaWZmZXJlbnRpYWwgZ2VuZSBleHByZXNzaW9uIGFuYWx5c2lzCmNhdCgiUGVyZm9ybSBkaWZmZXJlbnRpYWwgZ2VuZSBleHByZXNzaW9uIGFuYWx5c2lzIG9uIHRoZSBpZGVudGlmaWVkIGNsdXN0ZXJzLi5cbiIpCklkZW50cyhURTAwMV9zdWJjbHVzdGVyaW5nKSA8LSAic2V1cmF0X2NsdXN0ZXJzIgogIAojIFVzZSBSTkEgc2xvdCBmb3IgY2FsY3VsYXRpb24gb2YgREUgZ2VuZXMKVEUwMDFfc3ViY2x1c3RlcmluZyA8LSBOb3JtYWxpemVEYXRhKFRFMDAxX3N1YmNsdXN0ZXJpbmcsIGFzc2F5PSJSTkEiLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJMb2dOb3JtYWxpemUiKQogIAojIEZpbmRBbGxNYXJrZXJzClRFMDAxX3N1YmNsdXN0ZXJpbmdfbWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhURTAwMV9zdWJjbHVzdGVyaW5nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2F5ID0gIlJOQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90PSJkYXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QudXNlID0gIndpbGNveCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seS5wb3MgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbi5wY3QgPSAwLjI1KQogIAp0b3AxMCA8LSBURTAwMV9zdWJjbHVzdGVyaW5nX21hcmtlcnMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbihuID0gMTAsIHd0ID0gYXZnX2xvZzJGQykKYGBgCgpHZW5lcmF0ZSBhIGhlYXRtYXAgc2hvd2luZyB0aGUgdG9wIDEwIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcyBvbiBhIHBlci1jbHVzdGVyIGJhc2lzCgpgYGB7ciwgZmlnLndpZHRoPTE4LCBmaWcuaGVpZ2h0PTI0fQpnZW5lcyA8LSB0b3AxMCRnZW5lCm1hdF90b19zaG93IDwtIGFzLm1hdHJpeChURTAwMV9zdWJjbHVzdGVyaW5nQGFzc2F5cyRTQ1RAc2NhbGUuZGF0YVtnZW5lcyxdKQogIApDbHVzdGVycyA8LSBURTAwMV9zdWJjbHVzdGVyaW5nJHNldXJhdF9jbHVzdGVycwpjb2xvcnMgPC0gcmFpbmJvdyhubGV2ZWxzKENsdXN0ZXJzKSkgCm5hbWVzKGNvbG9ycykgPC0gbGV2ZWxzKENsdXN0ZXJzKQogIAojIHByZXBhcmUgZGZfYW5ub3QuZGYgCnBlci5jZWxsLnNpbC53aWR0aCA8LSBzWywic2lsX3dpZHRoIl0KbmFtZXMocGVyLmNlbGwuc2lsLndpZHRoKSA8LSBjb2xuYW1lcyhURTAwMV9zdWJjbHVzdGVyaW5nKQogIApkZl9hbm5vdC5kZiA8LSBURTAwMV9zdWJjbHVzdGVyaW5nQG1ldGEuZGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KGNsdXN0ZXJfaWQ9c2V1cmF0X2NsdXN0ZXJzLCBjeXRvdHJhY2Vfc2NvcmUgPSBjeXRvdHJhY2VfdGUwMDEpICU+JQogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKC4sdmFyPSJjZWxsX2lkIikKZGZfYW5ub3QuZGYkY2x1c3Rlcl9pZCA8LSBmYWN0b3IoYXMubnVtZXJpYyhkZl9hbm5vdC5kZiRjbHVzdGVyX2lkKSkKICAKeCA8LSBhcy5kYXRhLmZyYW1lKHBlci5jZWxsLnNpbC53aWR0aCkgJT4lCiAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLix2YXI9InNhbXBsZV9pZCIpCiAgIApkZl9hbm5vdC5kZiA8LSBsZWZ0X2pvaW4oZGZfYW5ub3QuZGYseCxieT1jKCJjZWxsX2lkIj0ic2FtcGxlX2lkIikpCiAgCmRmX2Fubm90LmRmIDwtIG1lcmdlKGRmX2Fubm90LmRmLCBURTAwMV9zdWJjbHVzdGVyaW5nQG1ldGEuZGF0YVssIGMoImNlbGxfaWQiLCAic2V1cmF0X2NsdXN0ZXJzIildLCBieSA9ICJjZWxsX2lkIiwgYWxsLnggPSBUUlVFKSAjIHJlbmFtZSBjbHVzdGVycyBhcyBhIHRyZWUtbGlrZSBzdHJ1Y3R1cmUKZGZfYW5ub3QuZGYgPC0gZGZfYW5ub3QuZGZbLC0yXSAlPiUgZHBseXI6OnJlbmFtZShjbHVzdGVyX2lkPXNldXJhdF9jbHVzdGVycykKCnNhbXBsZV9vcmRlcmluZ190b19wcmludCA8LSByZXYoIG9yZGVyKCBkZl9hbm5vdC5kZiRwZXIuY2VsbC5zaWwud2lkdGggKSApCiAgCmRmX2Fubm90LmRmIDwtIGRmX2Fubm90LmRmW3NhbXBsZV9vcmRlcmluZ190b19wcmludCxdCiAgCm1hdF90b19zaG93IDwtIG1hdF90b19zaG93WyxtYXRjaChkZl9hbm5vdC5kZiRjZWxsX2lkLGNvbG5hbWVzKG1hdF90b19zaG93KSldCiAgCnN0b3BpZm5vdChpZGVudGljYWwoIGRmX2Fubm90LmRmJGNlbGxfaWQsIGNvbG5hbWVzKG1hdF90b19zaG93KSApKQogIAojIHRoZSBzaWxob3VldHRlIHNjb3JlCnNpbC5maWxsIDwtIHJlcChOQSwgbnJvdyhkZl9hbm5vdC5kZikpCnVuaXF1ZV9jbHVzdGVycyA8LSB1bmlxdWUoZGZfYW5ub3QuZGYkY2x1c3Rlcl9pZCkKbl9jb2xvcnMgPC0gbGVuZ3RoKGNvbG9ycykKICAKY29sb3JfaW5kZXggPC0gMQpmb3IgKGkgaW4gc2VxX2Fsb25nKHVuaXF1ZV9jbHVzdGVycykpIHsKICBjbHVzdGVyIDwtIHVuaXF1ZV9jbHVzdGVyc1tpXQogIHNpbC5maWxsW2RmX2Fubm90LmRmJGNsdXN0ZXJfaWQgPT0gY2x1c3Rlcl0gPC0gY29sb3JzW25hbWVzKGNvbG9ycykgPT0gY2x1c3Rlcl0KICBjb2xvcl9pbmRleCA8LSBpICsgMSAgIyBVc2UgbW9kdWxvIHRvIGN5Y2xlIHRocm91Z2ggY29sb3JzCn0KICAKZGZfYW5ub3RfY29sc19jbHVzdGVyX3Njb3JlIDwtIEhlYXRtYXBBbm5vdGF0aW9uKCAKICBzaWxob3VldHRlX3Njb3JlID0gYW5ub19iYXJwbG90KAogICAgZGZfYW5ub3QuZGYkcGVyLmNlbGwuc2lsLndpZHRoLAogICAgYmFyX3dpZHRoID0gMSwKICAgIGdwID0gZ3Bhcihjb2wgPSBOQSwgCiAgICAgICAgICAgICAgZm9udHNpemUgPSA2ICwKICAgICAgICAgICAgICBjZXggPSAwLjggLAogICAgICAgICAgICAgIGZpbGwgPSAgc2lsLmZpbGwgCiAgICApLAogICAgYm9yZGVyID0gRkFMU0UsCiAgICBoZWlnaHQgPSB1bml0KDEuMjUsICJjbSIpICwKICAgIHdpZHRoID0gdW5pdCgwLjUsICJjbSIpCiAgKQopCiAgCiMgaGVhdG1hcCBhbm5vdGF0aW9uCmRmX2Fubm90LmRmIDwtIGRmX2Fubm90LmRmICU+JSBkcGx5cjo6c2VsZWN0KGNsdXN0ZXJfaWQpCmNsdXN0ZXJfY29sb3JzIDwtIGNvbG9yc1sgIWlzLm5hKG5hbWVzKGNvbG9ycykpIF0KZGZfYW5ub3RfY29scyA9IEhlYXRtYXBBbm5vdGF0aW9uKCBkZiA9IGRmX2Fubm90LmRmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGxpc3QoY2x1c3Rlcl9pZD1jbHVzdGVyX2NvbG9ycykgICwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19sZWdlbmQgPSBUUlVFICwgbmFfY29sID0gImdyYXk5NSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9uYW1lX2dwID0gZ3Bhcihmb250c2l6ZT0wLjEpCikKICAKdG9wMTBfaG0gPC0gSGVhdG1hcCggbWF0X3RvX3Nob3csCiAgICAgICAgICAgICAgICAgICBjb2wgPSBjaXJjbGl6ZTo6Y29sb3JSYW1wMihyYW5nZShtYXRfdG9fc2hvd19kZWZhdWx0KS8yLCBjKCJkYXJrc2xhdGVibHVlIiwgInllbGxvdyIpKSwKICAgICAgICAgICAgICAgICAgIHVzZV9yYXN0ZXIgPSBGQUxTRSAsCiAgICAgICAgICAgICAgICAgICBjb2x1bW5fc3BsaXQgPSBkZl9hbm5vdC5kZiRjbHVzdGVyX2lkLAogICAgICAgICAgICAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGNvbG9yX2JhciA9ICJjb250aW51b3VzIikgLAkKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFICwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFICwKICAgICAgICAgICAgICAgICAgIHNob3dfY29sdW1uX25hbWVzID0gRkFMU0UgLAogICAgICAgICAgICAgICAgICAgbmFtZSA9ICJHZW5lIEV4cHJlc3Npb24gKGxvZzFwKSIgLCAgCiAgICAgICAgICAgICAgICAgICByb3dfbmFtZXNfZ3AgPSBncGFyKGZvbnRzaXplID0gMTApICwgY29sdW1uX25hbWVzX2dwID0gZ3Bhcihmb250c2l6ZSA9IDgpLAogICAgICAgICAgICAgICAgICByb3dfdGl0bGVfc2lkZSA9ICJsZWZ0IiAsIHJvd190aXRsZV9ncCA9IGdwYXIoZm9udHNpemUgPSAxMCwgZm9udGZhY2UgPSAiYm9sZCIpCiAgKQogIApodF9saXN0ID0gZGZfYW5ub3RfY29sc19jbHVzdGVyX3Njb3JlICV2JSBkZl9hbm5vdF9jb2xzICV2JSB0b3AxMF9obQogIApwZGYoZmlsZS5wYXRoKGZpZ3VyZXNfcGF0aCwidG9wXzEwX2hlYXRtYXAucGRmIiksIHdpZHRoID0gMTAsIGhlaWdodCA9IDEyKQpwIDwtIGRyYXcoaHRfbGlzdCwgY29sdW1uX2ttID0gMSAsIAogICAgICAgICAgaGVhdG1hcF9sZWdlbmRfc2lkZSA9ICJyaWdodCIsIAogICAgICAgICAgYW5ub3RhdGlvbl9sZWdlbmRfc2lkZSA9ICJib3R0b20iICkKZGV2Lm9mZigpICAKCnAKYGBgCgpEaXNwbGF5IGEgZG90cGxvdCB3aXRoIHRoZSB0b3AgNSBnZW5lcyBwZXIgY2x1c3RlciAodXNpbmcgdGhlIGBkYXRhYCBzbG90KS4KCmBgYHtyLCBmaWcud2lkdGg9MjIsIGZpZy5oZWlnaHQ9OX0KIyBEb3RQbG90CnRvcDUgPC0gVEUwMDFfc3ViY2x1c3RlcmluZ19tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24obiA9IDUsIHd0ID0gYXZnX2xvZzJGQykKICAKZ2VuZXNfZHAgPC0gdG9wNSRnZW5lICU+JSB1bmlxdWUoKQogIAojIGludGlhbGl6ZSBsaXN0cyBjb250YWluaW5nIGRhdGFmcmFtZXMgCkF2Z3MgPC0gdmVjdG9yKCBtb2RlPSJsaXN0IiwgbGVuZ3RoPWxlbmd0aChsZXZlbHMoVEUwMDFfc3ViY2x1c3RlcmluZyRzZXVyYXRfY2x1c3RlcnMpKSApCm5hbWVzKEF2Z3MpIDwtIGxldmVscyhURTAwMV9zdWJjbHVzdGVyaW5nJHNldXJhdF9jbHVzdGVycykKICAKUGN0IDwtIHZlY3RvciggbW9kZT0ibGlzdCIsIGxlbmd0aD1sZW5ndGgobGV2ZWxzKFRFMDAxX3N1YmNsdXN0ZXJpbmckc2V1cmF0X2NsdXN0ZXJzKSkgKQpuYW1lcyhQY3QpIDwtIGxldmVscyhURTAwMV9zdWJjbHVzdGVyaW5nJHNldXJhdF9jbHVzdGVycykKICAKZm9yIChjbHVzdGVyIGluIGxldmVscyhURTAwMV9zdWJjbHVzdGVyaW5nJHNldXJhdF9jbHVzdGVycykpewogIAogIGNlbGxzX2luX3N1YmNsdXN0ZXIgPC0gVEUwMDFfc3ViY2x1c3RlcmluZyRzZXVyYXRfY2x1c3RlcnMgPT0gY2x1c3RlcgogICAgCiAgIyBBdmcgCiAgQXZnc1tbY2x1c3Rlcl1dIDwtIFRFMDAxX3N1YmNsdXN0ZXJpbmdbWyJSTkEiXV1AZGF0YVtnZW5lc19kcCwgY2VsbHNfaW5fc3ViY2x1c3Rlcl0gJT4lCiAgICByb3dNZWFucygpICU+JSAKICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgICByb3duYW1lc190b19jb2x1bW4oKSAlPiUKICAgIGRwbHlyOjpyZW5hbWUoLiwiR2VuZSI9cm93bmFtZSwibWVhbiI9LikgJT4lIAogICAgZHBseXI6Om11dGF0ZShjbHVzdGVyPWNsdXN0ZXIpCiAgICAgIAogICMgUGN0CiAgUGN0W1tjbHVzdGVyXV0gPC0gVEUwMDFfc3ViY2x1c3RlcmluZ1tbIlJOQSJdXUBkYXRhW2dlbmVzX2RwLCBjZWxsc19pbl9zdWJjbHVzdGVyXSAlPiUKICAgIGFwcGx5KC4sMSwgZnVuY3Rpb24oeCl7IHN1bSh4PjApL2xlbmd0aCh4KSoxMDAgfSkgJT4lCiAgICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgICByb3duYW1lc190b19jb2x1bW4oKSAlPiUKICAgIGRwbHlyOjpyZW5hbWUoLiwiR2VuZSI9cm93bmFtZSwiUGN0Ij0uKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoY2x1c3Rlcj1jbHVzdGVyKQp9CiAgCiMgTWVhbgpkZl9tZWFuLkdFeCA8LSBkby5jYWxsKHJiaW5kLCBBdmdzKQogIHJvd25hbWVzKGRmX21lYW4uR0V4KSA8LSBOVUxMCiMgUGN0CmRmX3BjdC5HRXggPC0gZG8uY2FsbChyYmluZCwgUGN0KQpyb3duYW1lcyhkZl9wY3QuR0V4KSA8LSBOVUxMCiAgCiMgU3VtbWFyeQpzdW1tYXJ5LkdFeCA8LSBjYmluZChkZl9tZWFuLkdFeFssMToyXSxkZl9wY3QuR0V4WywyOjNdKSAKc3VtbWFyeS5HRXgkR2VuZSA8LSBmYWN0b3Ioc3VtbWFyeS5HRXgkR2VuZSwgbGV2ZWxzPWdlbmVzX2RwLCBvcmRlcmVkID0gVFJVRSkgCiAgCiMgUHJpbnRpbmcgZG90cGxvdCBmb3IgZ2VuZXMKY2F0KCJQcmludGluZyBkb3RwbG90cy4uXG4iKQpHRXguREdFX0RvdFBsb3QgPC0gZ2dwbG90KHN1bW1hcnkuR0V4LCBhZXMoeD1HZW5lLHk9Y2x1c3RlcikpICsKICBnZW9tX3BvaW50KGFlcyhzaXplID0gUGN0LCBmaWxsPSBtZWFuKSwgY29sb3I9ImJsYWNrIiwgc2hhcGU9MjEpICsKICBzY2FsZV9zaXplKCIlIGRldGVjdGVkIiwgcmFuZ2UgPSBjKDAsMTUpLCBicmVha3M9YygwLDI1LDUwLDc1LDEwMCksIGxpbWl0cz1jKDAsMTAwKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0ic3RlZWxibHVlMSIsIGhpZ2ggPSAicmVkIiwgbWlkPSJ3aGl0ZSIsbWlkcG9pbnQ9MCwKICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9cmFuZ2Uoc3VtbWFyeS5HRXgkbWVhbiksCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aWNrcy5jb2xvdXIgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJBdmVyYWdlIEV4cHJlc3Npb25cbmxvZzFwKGNvdW50cykiKSArCiAgeWxhYigiQ2x1c3RlciIpICsgeGxhYigiIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGFuZ2xlPTQ1LCBoanVzdD0xLCBjb2xvcj0iYmxhY2siKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEyLCBjb2xvcj0iYmxhY2siKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpICwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpCiAgKSAKICAKICAKcGRmKGZpbGUucGF0aChmaWd1cmVzX3BhdGgsICJHRXgtREdFLWRvdHBsb3QucGRmIikgLCB3aWR0aCA9IDIyICwgaGVpZ2h0ID0gOSkKcHJpbnQoR0V4LkRHRV9Eb3RQbG90KQpkZXYub2ZmKCkKICAKcHJpbnQoR0V4LkRHRV9Eb3RQbG90KQpgYGAKClNhdmUgU2V1cmF0IE9iamVjdCB3aXRoIGNsdXN0ZXJpbmcgc29sdXRpb24gYXMgYW4gYC5yZHNgIGZpbGUgdG8gdGhlIGBEYXRhRm9sZGVyYCBsb2NhdGlvbi4KCmBgYHtyfQpzYXZlUkRTKG9iamVjdD1URTAwMV9zdWJjbHVzdGVyaW5nLCBmaWxlPWZpbGUucGF0aChzYXZpbmdzRm9sZGVyLCAiVEUwMDFfaXRlcl9zdWJjbHVzdGVyaW5nX2dlbmVfZXhwci5yZHMiKSkKYGBgCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAK